blob: 4ac72b88624904be3891af41cbf875eb04cc00f7 [file] [log] [blame]
/*
* Copyright (C) 2017-2020 The Project X-Ray Authors.
*
* Use of this source code is governed by a ISC-style
* license that can be found in the LICENSE file or at
* https://opensource.org/licenses/ISC
*
* SPDX-License-Identifier: ISC
*/
#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:
using iterator_category = std::input_iterator_tag;
using value_type = SegbitsFileReader::value_type;
using difference_type = std::ptrdiff_t;
using pointer = value_type*;
using reference = value_type&;
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