/* * 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 namespace prjxray { std::unique_ptr SegbitsFileReader::InitWithFile( const std::string& path) { auto mapped_file = MemoryMappedFile::InitWithFile(path); if (!mapped_file) return nullptr; return std::unique_ptr( new SegbitsFileReader(std::move(mapped_file))); } SegbitsFileReader::iterator SegbitsFileReader::begin() { return iterator( absl::string_view(static_cast(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