/* Copyright (C) 2018 David Robillard Copyright (C) 2006-2007 Chris Hamilton This program 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 2 of the License, or (at your option) any later version. This program 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 this program. If not, see . */ #ifndef CHILBERT_HILBERT_HPP #define CHILBERT_HILBERT_HPP #include "chilbert/Algorithm.hpp" #include "chilbert/BigBitVec.hpp" #include "chilbert/FixBitVec.hpp" // Description of parameters: // // FOR REGULAR HILBERT INDICES // // CFixBitVec/CBigBitVec *p // Pointer to array of non-negative coordinate values. // // int m // Precision of all coordinate values (number of bits required to // represent the largest possible coordinate value). // // int n // Number of dimensions (size of the array *p). // // CFixBitVec/CBigBitVec &h // Hilbert index of maximum precision m*n. // // int *ms // Array of precision values, one per dimension. // // FOR COMPACT HILBERT INDICES // // CFixBitVec/CBigBitVec &hc // Compact Hilbert index of maximum precision M. // // int M // Net precision value, corresponding to the size of the compact // Hilbert code. If not provided, defaults to zero and will be calculated // by the function (sum_i { ms[i] }). // // int m // Largest precision value (max_i { ms[i] }). If not provided, defaults // to zero and will be calculated by the function, namespace chilbert { // fix -> fix inline void coordsToIndex( const CFixBitVec *p, int m, int n, CFixBitVec &h ) { coordsToIndex(p,m,n,h); } inline void indexToCoords( CFixBitVec *p, int m, int n, const CFixBitVec &h ) { indexToCoords(p,m,n,h); } inline void coordsToCompactIndex( const CFixBitVec *p, const int *ms, int n, CFixBitVec &hc, int M, int m ) { coordsToCompactIndex(p,ms,n,hc,M,m); } inline void compactIndexToCoords( CFixBitVec *p, const int *ms, int n, const CFixBitVec &hc, int M, int m ) { compactIndexToCoords(p,ms,n,hc,M,m); } // fix -> big inline void coordsToIndex( const CFixBitVec *p, int m, int n, CBigBitVec &h ) { coordsToIndex(p,m,n,h); } inline void indexToCoords( CFixBitVec *p, int m, int n, const CBigBitVec &h ) { indexToCoords(p,m,n,h); } inline void coordsToCompactIndex( const CFixBitVec *p, const int *ms, int n, CBigBitVec &hc, int M, int m ) { coordsToCompactIndex(p,ms,n,hc,M,m); } inline void compactIndexToCoords( CFixBitVec *p, const int *ms, int n, const CBigBitVec &hc, int M, int m ) { compactIndexToCoords(p,ms,n,hc,M,m); } // big -> big inline void coordsToIndex( const CBigBitVec *p, int m, int n, CBigBitVec &h ) { coordsToIndex(p,m,n,h); } inline void indexToCoords( CBigBitVec *p, int m, int n, const CBigBitVec &h ) { indexToCoords(p,m,n,h); } inline void coordsToCompactIndex( const CBigBitVec *p, const int *ms, int n, CBigBitVec &hc, int M, int m ) { coordsToCompactIndex(p,ms,n,hc,M,m); } inline void compactIndexToCoords( CBigBitVec *p, const int *ms, int n, const CBigBitVec &hc, int M, int m ) { compactIndexToCoords(p,ms,n,hc,M,m); } }; #endif