diff --git a/CMakeLists_files.cmake b/CMakeLists_files.cmake index 519697d43..c966157d5 100644 --- a/CMakeLists_files.cmake +++ b/CMakeLists_files.cmake @@ -41,6 +41,7 @@ list (APPEND MAIN_SOURCE_FILES list (APPEND TEST_SOURCE_FILES tests/test_block.cpp tests/test_boprops_ad.cpp + tests/test_span.cpp tests/test_syntax.cpp ) diff --git a/opm/autodiff/AutoDiffHelpers.hpp b/opm/autodiff/AutoDiffHelpers.hpp index 1fba87159..ca05b61e4 100644 --- a/opm/autodiff/AutoDiffHelpers.hpp +++ b/opm/autodiff/AutoDiffHelpers.hpp @@ -485,6 +485,10 @@ public: ASSERT(span_ == rhs.span_); return index_ != rhs.index_; } + int operator*() + { + return (*span_)[index_]; + } private: const Span* span_; int index_; diff --git a/tests/test_span.cpp b/tests/test_span.cpp new file mode 100644 index 000000000..5a8c0c868 --- /dev/null +++ b/tests/test_span.cpp @@ -0,0 +1,69 @@ +/* + Copyright 2013 SINTEF ICT, Applied Mathematics. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . +*/ + + +#include + +#if HAVE_DYNAMIC_BOOST_TEST +#define BOOST_TEST_DYN_LINK +#endif + +#define BOOST_TEST_MODULE SpanTest + +#include + +#include + + +BOOST_AUTO_TEST_CASE(OneArgConstr) +{ + const int num = 4; + const Span s(num); + BOOST_CHECK(s.size() == num); + for (int i = 0; i < num; ++i) { + BOOST_CHECK(s[i] == i); + } + int count = 0; + for (Span::const_iterator it = s.begin(); it != s.end(); ++it) { + BOOST_CHECK(*it == count); + ++count; + } + BOOST_CHECK(count = num); +} + +BOOST_AUTO_TEST_CASE(ThreeArgConstr) +{ + const int num = 3; + const int stride = 7; + const int start = 5; + const int seq[num] = { start, start + 1*stride, start + 2*stride }; + + const Span s(num, stride, start); + BOOST_CHECK(s.size() == num); + for (int i = 0; i < num; ++i) { + BOOST_CHECK(s[i] == seq[i]); + } + int count = 0; + for (Span::const_iterator it = s.begin(); it != s.end(); ++it) { + BOOST_CHECK(*it == seq[count]); + ++count; + } + BOOST_CHECK(count = num); +} +