bulletproofs: avoid std::vector allocations for slice

This commit is contained in:
moneromooo-monero 2018-11-09 19:57:31 +00:00
parent a9e03ebc6a
commit 2c7195d80c
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3

View file

@ -31,6 +31,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <boost/thread/mutex.hpp> #include <boost/thread/mutex.hpp>
#include "misc_log_ex.h" #include "misc_log_ex.h"
#include "span.h"
#include "common/perf_timer.h" #include "common/perf_timer.h"
#include "cryptonote_config.h" #include "cryptonote_config.h"
extern "C" extern "C"
@ -217,7 +218,7 @@ static rct::key vector_power_sum(const rct::key &x, size_t n)
} }
/* Given two scalar arrays, construct the inner product */ /* Given two scalar arrays, construct the inner product */
static rct::key inner_product(const rct::keyV &a, const rct::keyV &b) static rct::key inner_product(const epee::span<const rct::key> &a, const epee::span<const rct::key> &b)
{ {
CHECK_AND_ASSERT_THROW_MES(a.size() == b.size(), "Incompatible sizes of a and b"); CHECK_AND_ASSERT_THROW_MES(a.size() == b.size(), "Incompatible sizes of a and b");
rct::key res = rct::zero(); rct::key res = rct::zero();
@ -228,6 +229,11 @@ static rct::key inner_product(const rct::keyV &a, const rct::keyV &b)
return res; return res;
} }
static rct::key inner_product(const rct::keyV &a, const rct::keyV &b)
{
return inner_product(epee::span<const rct::key>(a.data(), a.size()), epee::span<const rct::key>(b.data(), b.size()));
}
/* Given two scalar arrays, construct the Hadamard product */ /* Given two scalar arrays, construct the Hadamard product */
static rct::keyV hadamard(const rct::keyV &a, const rct::keyV &b) static rct::keyV hadamard(const rct::keyV &a, const rct::keyV &b)
{ {
@ -293,7 +299,7 @@ static rct::keyV vector_subtract(const rct::keyV &a, const rct::key &b)
} }
/* Multiply a scalar and a vector */ /* Multiply a scalar and a vector */
static rct::keyV vector_scalar(const rct::keyV &a, const rct::key &x) static rct::keyV vector_scalar(const epee::span<const rct::key> &a, const rct::key &x)
{ {
rct::keyV res(a.size()); rct::keyV res(a.size());
for (size_t i = 0; i < a.size(); ++i) for (size_t i = 0; i < a.size(); ++i)
@ -303,6 +309,11 @@ static rct::keyV vector_scalar(const rct::keyV &a, const rct::key &x)
return res; return res;
} }
static rct::keyV vector_scalar(const rct::keyV &a, const rct::key &x)
{
return vector_scalar(epee::span<const rct::key>(a.data(), a.size()), x);
}
/* Create a vector from copies of a single value */ /* Create a vector from copies of a single value */
static rct::keyV vector_dup(const rct::key &x, size_t N) static rct::keyV vector_dup(const rct::key &x, size_t N)
{ {
@ -400,17 +411,12 @@ static rct::keyV invert(rct::keyV x)
} }
/* Compute the slice of a vector */ /* Compute the slice of a vector */
static rct::keyV slice(const rct::keyV &a, size_t start, size_t stop) static epee::span<const rct::key> slice(const rct::keyV &a, size_t start, size_t stop)
{ {
CHECK_AND_ASSERT_THROW_MES(start < a.size(), "Invalid start index"); CHECK_AND_ASSERT_THROW_MES(start < a.size(), "Invalid start index");
CHECK_AND_ASSERT_THROW_MES(stop <= a.size(), "Invalid stop index"); CHECK_AND_ASSERT_THROW_MES(stop <= a.size(), "Invalid stop index");
CHECK_AND_ASSERT_THROW_MES(start < stop, "Invalid start/stop indices"); CHECK_AND_ASSERT_THROW_MES(start < stop, "Invalid start/stop indices");
rct::keyV res(stop - start); return epee::span<const rct::key>(&a[start], stop - start);
for (size_t i = start; i < stop; ++i)
{
res[i - start] = a[i];
}
return res;
} }
static rct::key hash_cache_mash(rct::key &hash_cache, const rct::key &mash0, const rct::key &mash1) static rct::key hash_cache_mash(rct::key &hash_cache, const rct::key &mash0, const rct::key &mash1)