| /* |
| * 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 |
| */ |
| #include <prjxray/segbits_file_reader.h> |
| |
| namespace prjxray { |
| |
| std::unique_ptr<SegbitsFileReader> SegbitsFileReader::InitWithFile( |
| const std::string& path) { |
| auto mapped_file = MemoryMappedFile::InitWithFile(path); |
| if (!mapped_file) |
| return nullptr; |
| |
| return std::unique_ptr<SegbitsFileReader>( |
| new SegbitsFileReader(std::move(mapped_file))); |
| } |
| |
| SegbitsFileReader::iterator SegbitsFileReader::begin() { |
| return iterator( |
| absl::string_view(static_cast<const char*>(mapped_file_->data()), |
| mapped_file_->size())); |
| } |
| |
| SegbitsFileReader::iterator SegbitsFileReader::end() { |
| return iterator(absl::string_view()); |
| } |
| |
| SegbitsFileReader::value_type::value_type(const absl::string_view& view) { |
| size_t separator_start = view.find_first_of(" \t\n"); |
| if (separator_start == absl::string_view::npos) { |
| tag_ = view; |
| bit_ = absl::string_view(); |
| return; |
| } |
| |
| size_t bit_start = view.find_first_not_of(" \t", separator_start); |
| size_t newline = view.find('\n', bit_start); |
| if (newline == absl::string_view::npos) { |
| tag_ = view.substr(0, separator_start); |
| bit_ = view.substr(bit_start); |
| return; |
| } |
| |
| size_t bit_len = newline - bit_start; |
| tag_ = view.substr(0, separator_start); |
| bit_ = view.substr(bit_start, bit_len); |
| return; |
| } |
| |
| SegbitsFileReader::iterator& SegbitsFileReader::iterator::operator++() { |
| size_t newline = view_.find('\n'); |
| if (newline == absl::string_view::npos) { |
| view_ = absl::string_view(); |
| } |
| |
| view_.remove_prefix(newline + 1); |
| value_ = value_type(view_); |
| return *this; |
| } |
| |
| } // namespace prjxray |