migrate HilbertValue class to C++11, use fwd decl, remove boost/integer
This commit is contained in:
parent
859502c504
commit
0ff7ac6aad
@ -27,12 +27,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include "HilbertValue.h"
|
#include "HilbertValue.h"
|
||||||
|
|
||||||
uint64_t HilbertCode::operator() (
|
#include <osrm/Coordinate.h>
|
||||||
const FixedPointCoordinate & current_coordinate
|
|
||||||
) const {
|
uint64_t HilbertCode::operator()(const FixedPointCoordinate ¤t_coordinate) const
|
||||||
|
{
|
||||||
unsigned location[2];
|
unsigned location[2];
|
||||||
location[0] = current_coordinate.lat+( 90*COORDINATE_PRECISION);
|
location[0] = current_coordinate.lat + (90 * COORDINATE_PRECISION);
|
||||||
location[1] = current_coordinate.lon+(180*COORDINATE_PRECISION);
|
location[1] = current_coordinate.lon + (180 * COORDINATE_PRECISION);
|
||||||
|
|
||||||
TransposeCoordinate(location);
|
TransposeCoordinate(location);
|
||||||
return BitInterleaving(location[0], location[1]);
|
return BitInterleaving(location[0], location[1]);
|
||||||
@ -41,48 +42,59 @@ uint64_t HilbertCode::operator() (
|
|||||||
uint64_t HilbertCode::BitInterleaving(const uint32_t latitude, const uint32_t longitude) const
|
uint64_t HilbertCode::BitInterleaving(const uint32_t latitude, const uint32_t longitude) const
|
||||||
{
|
{
|
||||||
uint64_t result = 0;
|
uint64_t result = 0;
|
||||||
for(int8_t index = 31; index >= 0; --index){
|
for (int8_t index = 31; index >= 0; --index)
|
||||||
|
{
|
||||||
result |= (latitude >> index) & 1;
|
result |= (latitude >> index) & 1;
|
||||||
result <<= 1;
|
result <<= 1;
|
||||||
result |= (longitude >> index) & 1;
|
result |= (longitude >> index) & 1;
|
||||||
if(0 != index){
|
if (0 != index)
|
||||||
|
{
|
||||||
result <<= 1;
|
result <<= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HilbertCode::TransposeCoordinate( uint32_t * X) const
|
void HilbertCode::TransposeCoordinate(uint32_t *X) const
|
||||||
{
|
{
|
||||||
uint32_t M = 1 << (32-1), P, Q, t;
|
uint32_t M = 1 << (32 - 1), P, Q, t;
|
||||||
int i;
|
int i;
|
||||||
// Inverse undo
|
// Inverse undo
|
||||||
for( Q = M; Q > 1; Q >>= 1 ) {
|
for (Q = M; Q > 1; Q >>= 1)
|
||||||
P=Q-1;
|
{
|
||||||
for( i = 0; i < 2; ++i ) {
|
P = Q - 1;
|
||||||
|
for (i = 0; i < 2; ++i)
|
||||||
|
{
|
||||||
|
|
||||||
const bool condition = (X[i] & Q);
|
const bool condition = (X[i] & Q);
|
||||||
if( condition ) {
|
if (condition)
|
||||||
|
{
|
||||||
X[0] ^= P; // invert
|
X[0] ^= P; // invert
|
||||||
} else {
|
}
|
||||||
t = (X[0]^X[i]) & P;
|
else
|
||||||
|
{
|
||||||
|
t = (X[0] ^ X[i]) & P;
|
||||||
X[0] ^= t;
|
X[0] ^= t;
|
||||||
X[i] ^= t;
|
X[i] ^= t;
|
||||||
}
|
}
|
||||||
} // exchange
|
} // exchange
|
||||||
}
|
}
|
||||||
// Gray encode
|
// Gray encode
|
||||||
for( i = 1; i < 2; ++i ) {
|
for (i = 1; i < 2; ++i)
|
||||||
X[i] ^= X[i-1];
|
{
|
||||||
|
X[i] ^= X[i - 1];
|
||||||
}
|
}
|
||||||
t=0;
|
t = 0;
|
||||||
for( Q = M; Q > 1; Q >>= 1 ) {
|
for (Q = M; Q > 1; Q >>= 1)
|
||||||
const bool condition = (X[2-1] & Q);
|
{
|
||||||
if( condition ) {
|
const bool condition = (X[2 - 1] & Q);
|
||||||
t ^= Q-1;
|
if (condition)
|
||||||
|
{
|
||||||
|
t ^= Q - 1;
|
||||||
}
|
}
|
||||||
} //check if this for loop is wrong
|
} // check if this for loop is wrong
|
||||||
for( i = 0; i < 2; ++i ) {
|
for (i = 0; i < 2; ++i)
|
||||||
|
{
|
||||||
X[i] ^= t;
|
X[i] ^= t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,23 +28,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#ifndef HILBERTVALUE_H_
|
#ifndef HILBERTVALUE_H_
|
||||||
#define HILBERTVALUE_H_
|
#define HILBERTVALUE_H_
|
||||||
|
|
||||||
#include <osrm/Coordinate.h>
|
#include <cstdint>
|
||||||
|
|
||||||
#include <boost/integer.hpp>
|
|
||||||
#include <boost/noncopyable.hpp>
|
|
||||||
|
|
||||||
// computes a 64 bit value that corresponds to the hilbert space filling curve
|
// computes a 64 bit value that corresponds to the hilbert space filling curve
|
||||||
|
|
||||||
class HilbertCode : boost::noncopyable
|
struct FixedPointCoordinate;
|
||||||
|
|
||||||
|
class HilbertCode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
uint64_t operator()
|
uint64_t operator()(const FixedPointCoordinate ¤t_coordinate) const;
|
||||||
(
|
HilbertCode() {}
|
||||||
const FixedPointCoordinate & current_coordinate
|
HilbertCode(const HilbertCode &) = delete;
|
||||||
) const;
|
|
||||||
private:
|
private:
|
||||||
inline uint64_t BitInterleaving( const uint32_t a, const uint32_t b) const;
|
inline uint64_t BitInterleaving(const uint32_t a, const uint32_t b) const;
|
||||||
inline void TransposeCoordinate( uint32_t * X) const;
|
inline void TransposeCoordinate(uint32_t *X) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* HILBERTVALUE_H_ */
|
#endif /* HILBERTVALUE_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user