// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#include "utils/byte_writers.h"

#include <cstddef>
#include <cstdint>
#include <vector>

#include "riegeli/endian/endian_writing.h"

namespace credentio {

namespace {
// Best to specify template parameter explicitly when calling this.
template <class T>
void WriteNetworkOrder(T value, std::vector<uint8_t>* bytes) {
  size_t n = bytes->size();
  bytes->resize(n + sizeof(T));
  riegeli::WriteBigEndian<T>(value, reinterpret_cast<char*>(bytes->data() + n));
}

}  // namespace

void WriteUint16NetworkOrder(uint16_t value, std::vector<uint8_t>* bytes) {
  WriteNetworkOrder<uint16_t>(value, bytes);
}

void WriteUint32NetworkOrder(uint32_t value, std::vector<uint8_t>* bytes) {
  WriteNetworkOrder<uint32_t>(value, bytes);
}

void WriteUint64NetworkOrder(uint64_t value, std::vector<uint8_t>* bytes) {
  WriteNetworkOrder<uint64_t>(value, bytes);
}

}  // namespace credentio
