#include <prjxray/xilinx/xc7series/bitstream_reader.h>

namespace prjxray {
namespace xilinx {
namespace xc7series {

std::array<uint8_t, 4> BitstreamReader::kSyncWord{0xAA, 0x99, 0x55, 0x66};

BitstreamReader::BitstreamReader(std::vector<uint32_t>&& words)
    : words_(std::move(words)) {}

BitstreamReader::iterator BitstreamReader::begin() {
	return iterator(absl::MakeSpan(words_));
}

BitstreamReader::iterator BitstreamReader::end() {
	return iterator({});
}

BitstreamReader::iterator::iterator(absl::Span<uint32_t> words) {
	parse_result_.first = words;
	parse_result_.second = {};
	++(*this);
}

BitstreamReader::iterator& BitstreamReader::iterator::operator++() {
	do {
		auto new_result = ConfigurationPacket::InitWithWords(
		    parse_result_.first, parse_result_.second.has_value()
		                             ? parse_result_.second.operator->()
		                             : nullptr);

		// If the a valid header is being found but there are
		// insufficient words to yield a packet, consider it the end.
		if (new_result.first == parse_result_.first) {
			words_ = absl::Span<uint32_t>();
			break;
		}

		words_ = parse_result_.first;
		parse_result_ = new_result;
	} while (!parse_result_.first.empty() && !parse_result_.second);

	if (!parse_result_.second) {
		words_ = absl::Span<uint32_t>();
	}

	return *this;
}

bool BitstreamReader::iterator::operator==(const iterator& other) const {
	return words_ == other.words_;
}

bool BitstreamReader::iterator::operator!=(const iterator& other) const {
	return !(*this == other);
}

const BitstreamReader::value_type& BitstreamReader::iterator::operator*()
    const {
	return *(parse_result_.second);
}

const BitstreamReader::value_type* BitstreamReader::iterator::operator->()
    const {
	return parse_result_.second.operator->();
}

}  // namespace xc7series
}  // namespace xilinx
}  // namespace prjxray
