summaryrefslogtreecommitdiffstats
path: root/vespalib/src
diff options
context:
space:
mode:
authorGeir Storli <geirstorli@yahoo.no>2016-09-13 15:57:45 +0200
committerGitHub <noreply@github.com>2016-09-13 15:57:45 +0200
commit9a3c877f4fef0952a137292d7408054dc0575dcb (patch)
tree403c361cd30043cc3de04483489cfa8e25fe0ff3 /vespalib/src
parente103f84c91a0d48153de1dd9f0926dc4932b3f2f (diff)
parente2247f42f8b98a6d889aac63cae3d04cf88186aa (diff)
Merge pull request #627 from yahoo/toregge/stop-using-blind-static-casts
Replace use of static_cast with dynamic_cast and check for sucess.
Diffstat (limited to 'vespalib/src')
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor.cpp57
-rw-r--r--vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2.cpp52
-rw-r--r--vespalib/src/vespa/vespalib/tensor/dense/dense_tensor.cpp64
-rw-r--r--vespalib/src/vespa/vespalib/tensor/simple/simple_tensor.cpp58
4 files changed, 149 insertions, 82 deletions
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor.cpp
index caa54bc7606..c2fa7b762af 100644
--- a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor.cpp
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor.cpp
@@ -84,18 +84,22 @@ CompactTensor::sum() const
Tensor::UP
CompactTensor::add(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const CompactTensor &rhs = static_cast<const CompactTensor &>(arg);
- return joinTensors(*this, rhs,
+ const CompactTensor *rhs = dynamic_cast<const CompactTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return joinTensors(*this, *rhs,
[](double lhsValue, double rhsValue) { return lhsValue + rhsValue; });
}
Tensor::UP
CompactTensor::subtract(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const CompactTensor &rhs = static_cast<const CompactTensor &>(arg);
- return joinTensorsNegated(*this, rhs,
+ const CompactTensor *rhs = dynamic_cast<const CompactTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return joinTensorsNegated(*this, *rhs,
[](double lhsValue, double rhsValue) { return lhsValue + rhsValue; });
// Note that -rhsCell.second is passed to the lambda function, that is why we do addition.
}
@@ -103,37 +107,46 @@ CompactTensor::subtract(const Tensor &arg) const
Tensor::UP
CompactTensor::multiply(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- return CompactTensorProduct(*this, static_cast<const CompactTensor &>(arg)).result();
+ const CompactTensor *rhs = dynamic_cast<const CompactTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return CompactTensorProduct(*this, *rhs).result();
}
Tensor::UP
CompactTensor::min(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const CompactTensor &rhs = static_cast<const CompactTensor &>(arg);
- return joinTensors(*this, rhs,
+ const CompactTensor *rhs = dynamic_cast<const CompactTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return joinTensors(*this, *rhs,
[](double lhsValue, double rhsValue) { return std::min(lhsValue, rhsValue); });
}
Tensor::UP
CompactTensor::max(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const CompactTensor &rhs = static_cast<const CompactTensor &>(arg);
- return joinTensors(*this, rhs,
+ const CompactTensor *rhs = dynamic_cast<const CompactTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return joinTensors(*this, *rhs,
[](double lhsValue, double rhsValue) { return std::max(lhsValue, rhsValue); });
}
Tensor::UP
CompactTensor::match(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const CompactTensor &rhs = static_cast<const CompactTensor &>(arg);
- DirectTensorBuilder<CompactTensor> builder(combineDimensionsWith(rhs));
+ const CompactTensor *rhs = dynamic_cast<const CompactTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ DirectTensorBuilder<CompactTensor> builder(combineDimensionsWith(*rhs));
for (const auto &lhsCell : cells()) {
- auto rhsItr = rhs.cells().find(lhsCell.first);
- if (rhsItr != rhs.cells().end()) {
+ auto rhsItr = rhs->cells().find(lhsCell.first);
+ if (rhsItr != rhs->cells().end()) {
builder.insertCell(lhsCell.first, lhsCell.second * rhsItr->second);
}
}
@@ -155,7 +168,11 @@ CompactTensor::sum(const vespalib::string &dimension) const
bool
CompactTensor::equals(const Tensor &arg) const
{
- return *this == static_cast<const CompactTensor &>(arg);
+ const CompactTensor *rhs = dynamic_cast<const CompactTensor *>(&arg);
+ if (!rhs) {
+ return false;
+ }
+ return *this == *rhs;
}
vespalib::string
diff --git a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2.cpp b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2.cpp
index 056637f2a1c..48962791e59 100644
--- a/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2.cpp
+++ b/vespalib/src/vespa/vespalib/tensor/compact/compact_tensor_v2.cpp
@@ -86,52 +86,66 @@ CompactTensorV2::sum() const
Tensor::UP
CompactTensorV2::add(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const CompactTensorV2 &rhs = static_cast<const CompactTensorV2 &>(arg);
- return joinCompactTensorsV2(*this, rhs,
+ const CompactTensorV2 *rhs = dynamic_cast<const CompactTensorV2 *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return joinCompactTensorsV2(*this, *rhs,
[](double lhsValue, double rhsValue) { return lhsValue + rhsValue; });
}
Tensor::UP
CompactTensorV2::subtract(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const CompactTensorV2 &rhs = static_cast<const CompactTensorV2 &>(arg);
+ const CompactTensorV2 *rhs = dynamic_cast<const CompactTensorV2 *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
// Note that -rhsCell.second is passed to the lambda function, that is why we do addition.
- return joinCompactTensorsV2Negated(*this, rhs,
+ return joinCompactTensorsV2Negated(*this, *rhs,
[](double lhsValue, double rhsValue) { return lhsValue + rhsValue; });
}
Tensor::UP
CompactTensorV2::multiply(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- return CompactTensorV2Product(*this, static_cast<const CompactTensorV2 &>(arg)).result();
+ const CompactTensorV2 *rhs = dynamic_cast<const CompactTensorV2 *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return CompactTensorV2Product(*this, *rhs).result();
}
Tensor::UP
CompactTensorV2::min(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const CompactTensorV2 &rhs = static_cast<const CompactTensorV2 &>(arg);
- return joinCompactTensorsV2(*this, rhs,
+ const CompactTensorV2 *rhs = dynamic_cast<const CompactTensorV2 *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return joinCompactTensorsV2(*this, *rhs,
[](double lhsValue, double rhsValue) { return std::min(lhsValue, rhsValue); });
}
Tensor::UP
CompactTensorV2::max(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const CompactTensorV2 &rhs = static_cast<const CompactTensorV2 &>(arg);
- return joinCompactTensorsV2(*this, rhs,
+ const CompactTensorV2 *rhs = dynamic_cast<const CompactTensorV2 *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return joinCompactTensorsV2(*this, *rhs,
[](double lhsValue, double rhsValue) { return std::max(lhsValue, rhsValue); });
}
Tensor::UP
CompactTensorV2::match(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- return CompactTensorV2Match(*this, static_cast<const CompactTensorV2 &>(arg)).result();
+ const CompactTensorV2 *rhs = dynamic_cast<const CompactTensorV2 *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return CompactTensorV2Match(*this, *rhs).result();
}
Tensor::UP
@@ -149,7 +163,11 @@ CompactTensorV2::sum(const vespalib::string &dimension) const
bool
CompactTensorV2::equals(const Tensor &arg) const
{
- return *this == static_cast<const CompactTensorV2 &>(arg);
+ const CompactTensorV2 *rhs = dynamic_cast<const CompactTensorV2 *>(&arg);
+ if (!rhs) {
+ return false;
+ }
+ return *this == *rhs;
}
vespalib::string
diff --git a/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor.cpp b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor.cpp
index 7aaa4e0a71a..1f1b318d9a2 100644
--- a/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor.cpp
+++ b/vespalib/src/vespa/vespalib/tensor/dense/dense_tensor.cpp
@@ -202,10 +202,12 @@ DenseTensor::sum() const
Tensor::UP
DenseTensor::add(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const DenseTensor &rhs = static_cast<const DenseTensor &>(arg);
- checkDimensions(*this, rhs, "add");
- return joinDenseTensors(*this, rhs,
+ const DenseTensor *rhs = dynamic_cast<const DenseTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ checkDimensions(*this, *rhs, "add");
+ return joinDenseTensors(*this, *rhs,
[](double lhsValue, double rhsValue)
{ return lhsValue + rhsValue; });
}
@@ -213,11 +215,13 @@ DenseTensor::add(const Tensor &arg) const
Tensor::UP
DenseTensor::subtract(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const DenseTensor &rhs = static_cast<const DenseTensor &>(arg);
+ const DenseTensor *rhs = dynamic_cast<const DenseTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
// Note that - *rhsCellItr is passed to the lambda function, that is why we do addition.
- checkDimensions(*this, rhs, "subtract");
- return joinDenseTensorsNegated(*this, rhs,
+ checkDimensions(*this, *rhs, "subtract");
+ return joinDenseTensorsNegated(*this, *rhs,
[](double lhsValue, double rhsValue)
{ return lhsValue + rhsValue; });
}
@@ -225,18 +229,22 @@ DenseTensor::subtract(const Tensor &arg) const
Tensor::UP
DenseTensor::multiply(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const DenseTensor &rhs = static_cast<const DenseTensor &>(arg);
- return DenseTensorProduct(*this, rhs).result();
+ const DenseTensor *rhs = dynamic_cast<const DenseTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return DenseTensorProduct(*this, *rhs).result();
}
Tensor::UP
DenseTensor::min(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const DenseTensor &rhs = static_cast<const DenseTensor &>(arg);
- checkDimensions(*this, rhs, "min");
- return joinDenseTensors(*this, rhs,
+ const DenseTensor *rhs = dynamic_cast<const DenseTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ checkDimensions(*this, *rhs, "min");
+ return joinDenseTensors(*this, *rhs,
[](double lhsValue, double rhsValue)
{ return std::min(lhsValue, rhsValue); });
}
@@ -244,10 +252,12 @@ DenseTensor::min(const Tensor &arg) const
Tensor::UP
DenseTensor::max(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const DenseTensor &rhs = static_cast<const DenseTensor &>(arg);
- checkDimensions(*this, rhs, "max");
- return joinDenseTensors(*this, rhs,
+ const DenseTensor *rhs = dynamic_cast<const DenseTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ checkDimensions(*this, *rhs, "max");
+ return joinDenseTensors(*this, *rhs,
[](double lhsValue, double rhsValue)
{ return std::max(lhsValue,rhsValue); });
}
@@ -255,10 +265,12 @@ DenseTensor::max(const Tensor &arg) const
Tensor::UP
DenseTensor::match(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const DenseTensor &rhs = static_cast<const DenseTensor &>(arg);
- checkDimensions(*this, rhs, "match");
- return joinDenseTensors(*this, rhs,
+ const DenseTensor *rhs = dynamic_cast<const DenseTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ checkDimensions(*this, *rhs, "match");
+ return joinDenseTensors(*this, *rhs,
[](double lhsValue, double rhsValue)
{ return (lhsValue * rhsValue); });
}
@@ -286,7 +298,11 @@ DenseTensor::sum(const vespalib::string &dimension) const
bool
DenseTensor::equals(const Tensor &arg) const
{
- return *this == static_cast<const DenseTensor &>(arg);
+ const DenseTensor *rhs = dynamic_cast<const DenseTensor *>(&arg);
+ if (!rhs) {
+ return false;
+ }
+ return *this == *rhs;
}
vespalib::string
diff --git a/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor.cpp b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor.cpp
index 0d284b7e9b6..cd1dd935fe8 100644
--- a/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor.cpp
+++ b/vespalib/src/vespa/vespalib/tensor/simple/simple_tensor.cpp
@@ -59,56 +59,69 @@ SimpleTensor::sum() const
Tensor::UP
SimpleTensor::add(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const SimpleTensor &rhs = static_cast<const SimpleTensor &>(arg);
- return joinTensors(*this, rhs,
+ const SimpleTensor *rhs = dynamic_cast<const SimpleTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return joinTensors(*this, *rhs,
[](double lhsValue, double rhsValue) { return lhsValue + rhsValue; });
}
Tensor::UP
SimpleTensor::subtract(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const SimpleTensor &rhs = static_cast<const SimpleTensor &>(arg);
+ const SimpleTensor *rhs = dynamic_cast<const SimpleTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
// Note that -rhsCell.second is passed to the lambda function, that is why we do addition.
- return joinTensorsNegated(*this, rhs,
+ return joinTensorsNegated(*this, *rhs,
[](double lhsValue, double rhsValue) { return lhsValue + rhsValue; });
}
Tensor::UP
SimpleTensor::multiply(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- return SimpleTensorProduct(*this, static_cast<const SimpleTensor &>(arg)).result();
+ const SimpleTensor *rhs = dynamic_cast<const SimpleTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return SimpleTensorProduct(*this, *rhs).result();
}
Tensor::UP
SimpleTensor::min(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const SimpleTensor &rhs = static_cast<const SimpleTensor &>(arg);
- return joinTensors(*this, rhs,
+ const SimpleTensor *rhs = dynamic_cast<const SimpleTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return joinTensors(*this, *rhs,
[](double lhsValue, double rhsValue){ return std::min(lhsValue, rhsValue); });
}
Tensor::UP
SimpleTensor::max(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const SimpleTensor &rhs = static_cast<const SimpleTensor &>(arg);
- return joinTensors(*this, rhs,
+ const SimpleTensor *rhs = dynamic_cast<const SimpleTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ return joinTensors(*this, *rhs,
[](double lhsValue, double rhsValue){ return std::max(lhsValue, rhsValue); });
}
Tensor::UP
SimpleTensor::match(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- const SimpleTensor &rhs = static_cast<const SimpleTensor &>(arg);
- DirectTensorBuilder<SimpleTensor> builder(combineDimensionsWith(rhs));
+ const SimpleTensor *rhs = dynamic_cast<const SimpleTensor *>(&arg);
+ if (!rhs) {
+ return Tensor::UP();
+ }
+ DirectTensorBuilder<SimpleTensor> builder(combineDimensionsWith(*rhs));
for (const auto &lhsCell : cells()) {
- auto rhsItr = rhs.cells().find(lhsCell.first);
- if (rhsItr != rhs.cells().end()) {
+ auto rhsItr = rhs->cells().find(lhsCell.first);
+ if (rhsItr != rhs->cells().end()) {
builder.insertCell(lhsCell.first, lhsCell.second * rhsItr->second);
}
}
@@ -130,8 +143,11 @@ SimpleTensor::sum(const vespalib::string &dimension) const
bool
SimpleTensor::equals(const Tensor &arg) const
{
- // TODO (geirst): Better type handling when multiple implementations are available.
- return *this == static_cast<const SimpleTensor &>(arg);
+ const SimpleTensor *rhs = dynamic_cast<const SimpleTensor *>(&arg);
+ if (!rhs) {
+ return false;
+ }
+ return *this == *rhs;
}
vespalib::string