Program Listing for File MoveRIndex.h

↰ Return to documentation for file (ADS/compression/MoveRIndex.h)

/*--------------------------------------------------------------------------*/
/*---------------------------- File MoveRIndex.h ---------------------------*/
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/*----------------------------- DEFINITIONS --------------------------------*/
/*--------------------------------------------------------------------------*/

#ifndef __ADS_MoveRIndex
 #define __ADS_MoveRIndex
                      /* self-identification: #endif constant */

/*--------------------------------------------------------------------------*/
/*------------------------------ INCLUDES ----------------------------------*/
/*--------------------------------------------------------------------------*/

#include "ADS/Contract.h"
#include "ADS/compression/BurrowsWheeler.h"
#include "ADS/succinct/BitVector.h"
#include "ADS/succinct/RankSelect.h"
#include "ADS/succinct/HuffmanWaveletTree.h"
#include "ADS/succinct/MoveStructure.h"

#include <algorithm>
#include <array>
#include <bit>
#include <cstddef>
#include <cstdint>
#include <string>
#include <string_view>
#include <tuple>
#include <utility>
#include <vector>

/*--------------------------------------------------------------------------*/
/*--------------------------- NAMESPACE ------------------------------------*/
/*--------------------------------------------------------------------------*/

namespace ADS {

/*--------------------------------------------------------------------------*/
/*---------------------------- CLASS MoveRIndex ----------------------------*/
/*--------------------------------------------------------------------------*/

class MoveRIndex {

/*--------------------------------------------------------------------------*/
 public:

 MoveRIndex( void ) : MoveRIndex( std::string_view() ) {}

 explicit MoveRIndex( std::string_view s );

 [[nodiscard]] std::size_t size( void ) const { return( f_n ); }

 [[nodiscard]] std::size_t intervals( void ) const {
  return( f_lf.intervals() );
  }

 [[nodiscard]] std::size_t count( std::string_view P ) const;

 [[nodiscard]] std::vector< std::size_t > locate( std::string_view P ) const;

 [[nodiscard]] std::size_t sizeInBits( void ) const;

/*--------------------------------------------------------------------------*/
 private:

 template< bool Toehold >
 [[nodiscard]] bool search( std::string_view P , std::uint64_t & s ,
                            std::size_t & is , std::uint64_t & e ,
                            std::size_t & ie , std::uint64_t & v ,
                            std::size_t & iv ) const;

 std::size_t f_n = 0;
 int f_w = 1 , f_wi = 1;
 MoveStructure f_lf;
 HuffmanWaveletTree< RankSelect > f_tag;
 std::array< std::size_t , 257 > f_cnt{};
 MoveStructure f_phi;
 BitVector f_end;
 BitVector f_endPhi;
#if ADS_CONTRACTS >= 3
 std::string f_text;
#endif

 };  // end( class MoveRIndex )

/*--------------------------------------------------------------------------*/

}  // end( namespace ADS )

/*--------------------------------------------------------------------------*/
/*-------------------------- IMPLEMENTATION --------------------------------*/
/*--------------------------------------------------------------------------*/

#include "ADS/compression/impl/MoveRIndex.tpp"

/*--------------------------------------------------------------------------*/

#endif  /* MoveRIndex.h included */

/*--------------------------------------------------------------------------*/
/*-------------------------- End File MoveRIndex.h -------------------------*/
/*--------------------------------------------------------------------------*/