#ifndef PRJXRAY_LIB_SEGBITS_FILE_READER_H
#define PRJXRAY_LIB_SEGBITS_FILE_READER_H

#include <iterator>
#include <memory>

#include <absl/strings/string_view.h>
#include <prjxray/memory_mapped_file.h>

namespace prjxray {

class SegbitsFileReader {
       public:
	class value_type {
	       public:
		absl::string_view tag() const { return tag_; }
		absl::string_view bit() const { return bit_; }

	       private:
		friend SegbitsFileReader;

		value_type(const absl::string_view& view);

		absl::string_view tag_;
		absl::string_view bit_;
	};

	class iterator
	    : public std::iterator<std::input_iterator_tag, value_type> {
	       public:
		iterator& operator++();

		bool operator==(iterator other) const {
			return view_ == other.view_;
		}
		bool operator!=(iterator other) const {
			return !(*this == other);
		}

		const value_type& operator*() const { return value_; }
		const value_type* operator->() const { return &value_; }

	       protected:
		explicit iterator(absl::string_view view)
		    : view_(view), value_(view) {}

	       private:
		friend SegbitsFileReader;

		absl::string_view view_;
		value_type value_;
	};

	static std::unique_ptr<SegbitsFileReader> InitWithFile(
	    const std::string& path);

	iterator begin();
	iterator end();

       private:
	SegbitsFileReader(std::unique_ptr<MemoryMappedFile>&& mapped_file)
	    : mapped_file_(std::move(mapped_file)){};

	std::unique_ptr<MemoryMappedFile> mapped_file_;
};

}  // namespace prjxray

#endif  // PRJXRAY_LIB_SEGBITS_FILE_READER_H
