aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-10-03 09:48:00 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2019-11-01 10:47:45 +0000
commit3348b25ef2831da17ce578061c85956eb9a80b5f (patch)
treec82032ededb317a828c43f203dce6883cc5545e3
parentf4c345da92694e6cff2e62381960dbde4ae51393 (diff)
Let dim be construction parameter and not template parameter.
-rw-r--r--staging_vespalib/src/vespa/vespalib/util/zncurve.cpp5
-rw-r--r--staging_vespalib/src/vespa/vespalib/util/zncurve.h15
-rw-r--r--staging_vespalib/src/vespa/vespalib/util/zncurve.hpp46
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