/* * Copyright (C) 2015 Nicolas Bonnefon and other contributors * * This file is part of glogg. * * glogg is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * glogg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with glogg. If not, see . */ #ifndef LINEPOSITIONARRAY_H #define LINEPOSITIONARRAY_H #include #include "data/compressedlinestorage.h" typedef std::vector SimpleLinePositionStorage; // This class is a list of end of lines position, // in addition to a list of uint64_t (positions within the files) // it can keep track of whether the final LF was added (for non-LF terminated // files) and remove it when more data are added. template class LinePosition { public: template friend class LinePosition; // Default constructor LinePosition() : array() { fakeFinalLF_ = false; } // Copy constructor (slow: deleted) LinePosition( const LinePosition& orig ) = delete; // Move assignement LinePosition& operator=( LinePosition&& orig ) { array = std::move( orig.array ); fakeFinalLF_ = orig.fakeFinalLF_; return *this; } // Add a new line position at the given position // Invariant: pos must be greater than the previous one // (this is NOT checked!) inline void append( uint64_t pos ) { if ( fakeFinalLF_ ) array.pop_back(); array.push_back( pos ); fakeFinalLF_ = false; } // Size of the array inline int size() const { return array.size(); } // Extract an element inline uint64_t at( int i ) const { return array.at( i ); } inline uint64_t operator[]( int i ) const { return array.at( i ); } // Set the presence of a fake final LF // Must be used after 'append'-ing a fake LF at the end. void setFakeFinalLF( bool finalLF=true ) { fakeFinalLF_ = finalLF; } // Add another list to this one, removing any fake LF on this list. // Invariant: all pos in other must be greater than any pos in this // (this is NOT checked!) void append_list( const LinePosition& other ) { // If our final LF is fake, we remove it if ( fakeFinalLF_ ) this->array.pop_back(); // Append the arrays this->array.append_list( other.array ); //array += other.array; // In case the 'other' object has a fake LF this->fakeFinalLF_ = other.fakeFinalLF_; } private: Storage array; bool fakeFinalLF_; }; // Use the non-optimised storage typedef LinePosition FastLinePositionArray; //typedef LinePosition LinePositionArray; typedef LinePosition LinePositionArray; #endif