// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "input.h"

#include <algorithm>

#include <openssl/base.h>

namespace bssl::der {

std::string Input::AsString() const {
  return std::string(reinterpret_cast<const char *>(data_.data()),
                     data_.size());
}

std::string_view Input::AsStringView() const {
  return std::string_view(reinterpret_cast<const char *>(data_.data()),
                          data_.size());
}

bssl::Span<const uint8_t> Input::AsSpan() const { return data_; }

bool operator==(const Input &lhs, const Input &rhs) {
  return lhs.AsSpan() == rhs.AsSpan();
}

bool operator!=(const Input &lhs, const Input &rhs) { return !(lhs == rhs); }

ByteReader::ByteReader(const Input &in)
    : data_(in.UnsafeData()), len_(in.Length()) {}

bool ByteReader::ReadByte(uint8_t *byte_p) {
  if (!HasMore()) {
    return false;
  }
  *byte_p = *data_;
  Advance(1);
  return true;
}

bool ByteReader::ReadBytes(size_t len, Input *out) {
  if (len > len_) {
    return false;
  }
  *out = Input(data_, len);
  Advance(len);
  return true;
}

// Returns whether there is any more data to be read.
bool ByteReader::HasMore() { return len_ > 0; }

void ByteReader::Advance(size_t len) {
  BSSL_CHECK(len <= len_);
  data_ += len;
  len_ -= len;
}

}  // namespace bssl::der
