diff --git a/include/boost/multi_array/index_range.hpp b/include/boost/multi_array/index_range.hpp index 3d6035e7..b0896a0f 100644 --- a/include/boost/multi_array/index_range.hpp +++ b/include/boost/multi_array/index_range.hpp @@ -107,6 +107,15 @@ namespace multi_array { index stride() const { return stride_; } + size_type size(index idx) const + { + return ( + (this->start_ == this_type::from_start()) || ( + this->finish_ == this_type::to_end() + ) + ) ? idx : ((this->finish_ - this->start_) / this->stride_); + } + void set_index_range(index start, index finish, index stride=1) { start_ = start; diff --git a/test/range1.cpp b/test/range1.cpp index 7141d847..7457bfc3 100644 --- a/test/range1.cpp +++ b/test/range1.cpp @@ -33,6 +33,7 @@ main() BOOST_TEST(r1.start() == -3); BOOST_TEST(r1.finish() == 5); BOOST_TEST(r1.stride() == 1); + BOOST_TEST(r1.size(0) == 8); BOOST_TEST(!r1.is_degenerate()); BOOST_TEST(r1.get_start(0) == -3); BOOST_TEST(r1.get_finish(100) == 5); @@ -43,6 +44,7 @@ main() BOOST_TEST(r2.start() == -3); BOOST_TEST(r2.finish() == 5); BOOST_TEST(r2.stride() == 2); + BOOST_TEST(r2.size(0) == 4); BOOST_TEST(!r2.is_degenerate()); } @@ -52,6 +54,7 @@ main() BOOST_TEST(r3.start() == 5); BOOST_TEST(r3.finish() == 6); BOOST_TEST(r3.stride() == 1); + BOOST_TEST(r3.size(0) == 1); BOOST_TEST(r3.is_degenerate()); } @@ -61,6 +64,7 @@ main() BOOST_TEST(r4.get_start(0) == 0); BOOST_TEST(r4.get_finish(100) == 100); BOOST_TEST(r4.stride() == 1); + BOOST_TEST(r4.size(0) == 0); } { @@ -69,6 +73,7 @@ main() BOOST_TEST(r5.start() == -3); BOOST_TEST(r5.stride() == 2); BOOST_TEST(r5.finish() == 7); + BOOST_TEST(r5.size(0) == 5); } // try out all the comparison operators @@ -77,6 +82,7 @@ main() BOOST_TEST(r6.start() == -3); BOOST_TEST(r6.stride() == 2); BOOST_TEST(r6.finish() == 7); + BOOST_TEST(r6.size(0) == 5); } { @@ -84,6 +90,7 @@ main() BOOST_TEST(r7.start() == -2); BOOST_TEST(r7.stride() == 1); BOOST_TEST(r7.finish() == 8); + BOOST_TEST(r7.size(0) == 10); } // arithmetic operators @@ -92,6 +99,7 @@ main() BOOST_TEST(r8.start() == 2); BOOST_TEST(r8.stride() == 1); BOOST_TEST(r8.finish() == 7); + BOOST_TEST(r8.size(0) == 5); } { @@ -99,6 +107,7 @@ main() BOOST_TEST(r9.start() == -2); BOOST_TEST(r9.stride() == 1); BOOST_TEST(r9.finish() == 3); + BOOST_TEST(r9.size(0) == 5); } return boost::report_errors();