summaryrefslogtreecommitdiffstats
path: root/eval
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-12-22 15:15:38 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2017-12-29 13:05:57 +0100
commiteaf9266473a87a3537266260e49ffaad1c534011 (patch)
tree2b8dca63b1fea4c63dd1d1ba78d90dbc21744ce2 /eval
parent91d0b8518a1b9bbff2675d4ff1541e7d35583f9b (diff)
Avoid all the plt indirections by declaring dll local and using simpler structures.
Conflicts: eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_ref.h
Diffstat (limited to 'eval')
-rw-r--r--eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_builder.h19
-rw-r--r--eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.cpp7
-rw-r--r--eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.h6
-rw-r--r--eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_ref.h2
4 files changed, 20 insertions, 14 deletions
diff --git a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_builder.h b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_builder.h
index 09286752550..ada8a10e541 100644
--- a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_builder.h
+++ b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_builder.h
@@ -2,9 +2,8 @@
#pragma once
-#include <vespa/vespalib/stllike/string.h>
-#include <vector>
#include "sparse_tensor_address_ref.h"
+#include <vespa/vespalib/stllike/string.h>
namespace vespalib::tensor {
@@ -19,16 +18,22 @@ namespace vespalib::tensor {
class SparseTensorAddressBuilder
{
private:
- std::vector<char> _address;
+ vespalib::Array<char> _address;
+protected:
void append(vespalib::stringref str) {
- const char *cstr = str.c_str();
- _address.insert(_address.end(), cstr, cstr + str.size() + 1);
+ for (size_t i(0); i < str.size(); i++) {
+ _address.push_back_fast(str[i]);
+ }
}
+ void ensure_room(size_t additional) { _address.reserve(_address.size() + additional); }
public:
SparseTensorAddressBuilder() : _address() {}
- void add(vespalib::stringref label) { append(label); }
- void addUndefined() { _address.emplace_back('\0'); }
+ void add(vespalib::stringref label) {
+ ensure_room(label.size()+1);
+ append(label);
+ }
+ void addUndefined() { _address.push_back('\0'); }
void clear() { _address.clear(); }
SparseTensorAddressRef getAddressRef() const {
return SparseTensorAddressRef(&_address[0], _address.size());
diff --git a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.cpp b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.cpp
index 9693832ea88..e0de63b90d2 100644
--- a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.cpp
+++ b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.cpp
@@ -47,15 +47,16 @@ TensorAddressCombiner::combine(SparseTensorAddressRef lhsRef,
SparseTensorAddressRef rhsRef)
{
clear();
+ ensure_room(lhsRef.size() + rhsRef.size());
SparseTensorAddressDecoder lhs(lhsRef);
SparseTensorAddressDecoder rhs(rhsRef);
for (auto op : _ops) {
switch (op) {
case AddressOp::LHS:
- add(lhs.decodeLabel());
+ append(lhs.decodeLabel());
break;
case AddressOp::RHS:
- add(rhs.decodeLabel());
+ append(rhs.decodeLabel());
break;
case AddressOp::BOTH:
auto lhsLabel(lhs.decodeLabel());
@@ -63,7 +64,7 @@ TensorAddressCombiner::combine(SparseTensorAddressRef lhsRef,
if (lhsLabel != rhsLabel) {
return false;
}
- add(lhsLabel);
+ append(lhsLabel);
}
}
return true;
diff --git a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.h b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.h
index 8e792cb100a..1a7f2fd8d3c 100644
--- a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.h
+++ b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_combiner.h
@@ -3,7 +3,8 @@
#pragma once
#include "sparse_tensor_address_builder.h"
-#include <vespa/eval/tensor/types.h>
+
+#define VESPA_DLL_LOCAL __attribute__ ((visibility("hidden")))
namespace vespalib::eval { class ValueType; }
namespace vespalib::tensor::sparse {
@@ -17,12 +18,11 @@ class TensorAddressCombiner : public SparseTensorAddressBuilder
enum class AddressOp { LHS, RHS, BOTH };
std::vector<AddressOp> _ops;
-
public:
TensorAddressCombiner(const eval::ValueType &lhs, const eval::ValueType &rhs);
~TensorAddressCombiner();
- bool combine(SparseTensorAddressRef lhsRef, SparseTensorAddressRef rhsRef);
+ VESPA_DLL_LOCAL bool combine(SparseTensorAddressRef lhsRef, SparseTensorAddressRef rhsRef);
size_t numOverlappingDimensions() const;
size_t numDimensions() const { return _ops.size(); }
};
diff --git a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_ref.h b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_ref.h
index ad14da4800b..321690085be 100644
--- a/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_ref.h
+++ b/eval/src/vespa/eval/tensor/sparse/sparse_tensor_address_ref.h
@@ -2,8 +2,8 @@
#pragma once
-#include <vector>
#include <vespa/vespalib/util/stash.h>
+#include <cstring>
namespace vespalib {