diff options
Diffstat (limited to 'src/boost/libs/multi_array/test/allocators.cpp')
-rw-r--r-- | src/boost/libs/multi_array/test/allocators.cpp | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/src/boost/libs/multi_array/test/allocators.cpp b/src/boost/libs/multi_array/test/allocators.cpp new file mode 100644 index 000000000..8bb099f22 --- /dev/null +++ b/src/boost/libs/multi_array/test/allocators.cpp @@ -0,0 +1,151 @@ +// Copyright 2019 Glen Joseph Fernandes +// (glenjofe@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#include <boost/core/lightweight_test.hpp> +#include <boost/multi_array.hpp> +#include <algorithm> + +template<class T> +class creator { +public: + typedef T value_type; + typedef T* pointer; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + + template<class U> + struct rebind { + typedef creator<U> other; + }; + + creator(int state) + : state_(state) { } + + template<class U> + creator(const creator<U>& other) + : state_(other.state()) { } + + T* allocate(std::size_t size) { + return static_cast<T*>(::operator new(sizeof(T) * size)); + } + + void deallocate(T* ptr, std::size_t) { + ::operator delete(ptr); + } + + int state() const { + return state_; + } + +private: + int state_; +}; + +template<class T, class U> +inline bool +operator==(const creator<T>& a, const creator<U>& b) +{ + return a.state() == b.state(); +} + +template<class T, class U> +inline bool +operator!=(const creator<T>& a, const creator<U>& b) +{ + return !(a == b); +} + +void test(const double&, std::size_t*, int*, unsigned) +{ +} + +template<class Array> +void test(const Array& array, std::size_t* sizes, int* strides, + unsigned elements) +{ + BOOST_TEST(array.num_elements() == elements); + BOOST_TEST(array.size() == *sizes); + BOOST_TEST(std::equal(sizes, sizes + array.num_dimensions(), array.shape())); + BOOST_TEST(std::equal(strides, strides + array.num_dimensions(), + array.strides())); + test(array[0], ++sizes, ++strides, elements / array.size()); +} + +bool test(const double& a, const double& b) +{ + return a == b; +} + +template<class A1, class A2> +bool test(const A1& a1, const A2& a2) +{ + typename A1::const_iterator i1 = a1.begin(); + typename A2::const_iterator i2 = a2.begin(); + for (; i1 != a1.end(); ++i1, ++i2) { + if (!test(*i1, *i2)) { + return false; + } + } + return true; +} + +int main() +{ + typedef boost::multi_array<double, 3, creator<double> > type; + creator<double> state(1); + { + type array(state); + } + boost::array<type::size_type, 3> sizes = { { 3, 3, 3 } }; + type::size_type elements = 27; + { + int strides[] = { 9, 3, 1 }; + type array(sizes, state); + test(array, &sizes[0], strides, elements); + } + { + int strides[] = { 1, 3, 9 }; + type array(sizes, boost::fortran_storage_order(), state); + test(array, &sizes[0], strides, elements); + } + { + int strides[] = { 9, 3, 1 }; + type::extent_gen extents; + type array(extents[3][3][3], state); + test(array, &sizes[0], strides, elements); + } + { + type array1(sizes, state); + std::vector<double> values(elements, 4.5); + array1.assign(values.begin(), values.end()); + type array2(array1); + int strides[] = { 9, 3, 1 }; + test(array2, &sizes[0], strides, elements); + BOOST_TEST(test(array1, array2)); + } + { + type array1(sizes, state); + type array2(sizes, state); + std::vector<double> values(elements, 4.5); + array1.assign(values.begin(), values.end()); + array2 = array1; + int strides[] = { 9, 3, 1 }; + test(array2, &sizes[0], strides, elements); + BOOST_TEST(test(array1, array2)); + } + { + type array1(sizes, state); + std::vector<double> values(elements, 4.5); + array1.assign(values.begin(), values.end()); + typedef type::subarray<2>::type other; + other array2 = array1[1]; + other::value_type value = array2[0]; + BOOST_TEST(test(array1[1][0], value)); + BOOST_TEST(test(array2[0], value)); + } + return boost::report_errors(); +} |