diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-10-03 09:48:00 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2019-11-01 10:47:45 +0000 |
commit | 3348b25ef2831da17ce578061c85956eb9a80b5f (patch) | |
tree | c82032ededb317a828c43f203dce6883cc5545e3 | |
parent | f4c345da92694e6cff2e62381960dbde4ae51393 (diff) |
Let dim be construction parameter and not template parameter.
-rw-r--r-- | staging_vespalib/src/vespa/vespalib/util/zncurve.cpp | 5 | ||||
-rw-r--r-- | staging_vespalib/src/vespa/vespalib/util/zncurve.h | 15 | ||||
-rw-r--r-- | staging_vespalib/src/vespa/vespalib/util/zncurve.hpp | 46 |
3 files changed, 44 insertions, 22 deletions
diff --git a/staging_vespalib/src/vespa/vespalib/util/zncurve.cpp b/staging_vespalib/src/vespa/vespalib/util/zncurve.cpp index 64157468f7e..32dd7f114f4 100644 --- a/staging_vespalib/src/vespa/vespalib/util/zncurve.cpp +++ b/staging_vespalib/src/vespa/vespalib/util/zncurve.cpp @@ -4,9 +4,8 @@ namespace vespalib { -template class ZNPoint<2, uint32_t>; -template class ZNPoint<4, uint32_t>; -template class ZNPoint<8, uint32_t>; +template class ZNPoint<uint32_t>; +template class ZNPoint<float>; } // namespace vespalib diff --git a/staging_vespalib/src/vespa/vespalib/util/zncurve.h b/staging_vespalib/src/vespa/vespalib/util/zncurve.h index e8b82e77e96..392e44b5d97 100644 --- a/staging_vespalib/src/vespa/vespalib/util/zncurve.h +++ b/staging_vespalib/src/vespa/vespalib/util/zncurve.h @@ -3,19 +3,24 @@ #pragma once #include <cstdint> +#include <vector> namespace vespalib { -template<int numDim, class T> +template<typename T> class ZNPoint { public: - ZNPoint(const T * begin); - uint64_t distance(const ZNPoint & rhs) const; + ZNPoint(const T * begin, uint32_t numDim); bool operator < (const ZNPoint & rhs) const; + double distance(const ZNPoint & rhs) const; + uint32_t numDim() const { return _vector.size(); } private: - T _vector[numDim]; - uint8_t _zCurve[sizeof(T)*numDim]; + std::vector<T> _vector; + std::vector<uint8_t> _point; }; +extern template class ZNPoint<uint32_t>; +extern template class ZNPoint<float>; + } // namespace vespalib diff --git a/staging_vespalib/src/vespa/vespalib/util/zncurve.hpp b/staging_vespalib/src/vespa/vespalib/util/zncurve.hpp index 896b668ddcc..a2c832d2bd2 100644 --- a/staging_vespalib/src/vespa/vespalib/util/zncurve.hpp +++ b/staging_vespalib/src/vespa/vespalib/util/zncurve.hpp @@ -5,36 +5,54 @@ #include "zncurve.h" #include <cstring> #include <cmath> +#include <cassert> namespace vespalib { -template<int numDim, class T> -ZNPoint<numDim, T>::ZNPoint(const T * begin) - : _vector(), - _zCurve() +namespace { + +template<typename T> +double squareDistance(T a, T b) { + T diff = a - b; + return diff * diff; +} + +template<uint32_t> +double squareDistance(uint32_t a, uint32_t b) { + int64_t diff = a - b; + return diff * diff; +} + +} + +template<typename T> +ZNPoint<T>::ZNPoint(const T * begin, uint32_t numDim) + : _vector(numDim), + _point(numDim*sizeof(T)) { for (uint32_t i(0); i < numDim; i++) { _vector[i] = begin[i]; } } -template<int numDim, class T> -uint64_t -ZNPoint<numDim, T>::distance(const ZNPoint & rhs) const +template<typename T> +double +ZNPoint<T>::distance(const ZNPoint & rhs) const { - uint64_t sum(0); - for (unsigned i(0); i < numDim; i++) { - int64_t diff = _vector[i] - rhs._vector[i]; - sum += diff*diff; + assert(numDim() == rhs.numDim()); + double sum(0); + for (unsigned i(0); i < numDim(); i++) { + sum += squareDistance(_vector[i], rhs._vector[i]); } return sqrt(sum); } -template<int numDim, class T> +template<typename T> bool -ZNPoint<numDim, T>::operator < (const ZNPoint & rhs) const +ZNPoint<T>::operator < (const ZNPoint & rhs) const { - return memcmp(_zCurve, rhs._zCurve, sizeof(_zCurve)) < 0; + assert(numDim() == rhs.numDim()); + return memcmp(&_point[0], &rhs._point[0], _point.size()) < 0; } } // namespace vespalib |