| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // Copyright (c) 2015 Microsoft Corporation. All rights reserved. |
| // |
| // This code is licensed under the MIT License (MIT). |
| // |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| // THE SOFTWARE. |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| #include <catch/catch.hpp> |
| |
| #include <gsl/gsl_algorithm> |
| |
| #include <array> |
| |
| using namespace std; |
| using namespace gsl; |
| |
| TEST_CASE("same_type") |
| { |
| // dynamic source and destination span |
| { |
| std::array<int, 5> src{1, 2, 3, 4, 5}; |
| std::array<int, 10> dst{}; |
| |
| span<int> src_span(src); |
| span<int> dst_span(dst); |
| |
| copy(src_span, dst_span); |
| copy(src_span, dst_span.subspan(src_span.size())); |
| |
| for (std::size_t i = 0; i < src.size(); ++i) { |
| CHECK(dst[i] == src[i]); |
| CHECK(dst[i + src.size()] == src[i]); |
| } |
| } |
| |
| // static source and dynamic destination span |
| { |
| std::array<int, 5> src{1, 2, 3, 4, 5}; |
| std::array<int, 10> dst{}; |
| |
| span<int, 5> src_span(src); |
| span<int> dst_span(dst); |
| |
| copy(src_span, dst_span); |
| copy(src_span, dst_span.subspan(src_span.size())); |
| |
| for (std::size_t i = 0; i < src.size(); ++i) { |
| CHECK(dst[i] == src[i]); |
| CHECK(dst[i + src.size()] == src[i]); |
| } |
| } |
| |
| // dynamic source and static destination span |
| { |
| std::array<int, 5> src{1, 2, 3, 4, 5}; |
| std::array<int, 10> dst{}; |
| |
| span<int> src_span(src); |
| span<int, 10> dst_span(dst); |
| |
| copy(src_span, dst_span); |
| copy(src_span, dst_span.subspan(src_span.size())); |
| |
| for (std::size_t i = 0; i < src.size(); ++i) { |
| CHECK(dst[i] == src[i]); |
| CHECK(dst[i + src.size()] == src[i]); |
| } |
| } |
| |
| // static source and destination span |
| { |
| std::array<int, 5> src{1, 2, 3, 4, 5}; |
| std::array<int, 10> dst{}; |
| |
| span<int, 5> src_span(src); |
| span<int, 10> dst_span(dst); |
| |
| copy(src_span, dst_span); |
| copy(src_span, dst_span.subspan(src_span.size())); |
| |
| for (std::size_t i = 0; i < src.size(); ++i) { |
| CHECK(dst[i] == src[i]); |
| CHECK(dst[i + src.size()] == src[i]); |
| } |
| } |
| } |
| |
| TEST_CASE("compatible_type") |
| { |
| // dynamic source and destination span |
| { |
| std::array<short, 5> src{1, 2, 3, 4, 5}; |
| std::array<int, 10> dst{}; |
| |
| span<short> src_span(src); |
| span<int> dst_span(dst); |
| |
| copy(src_span, dst_span); |
| copy(src_span, dst_span.subspan(src_span.size())); |
| |
| for (std::size_t i = 0; i < src.size(); ++i) { |
| CHECK(dst[i] == src[i]); |
| CHECK(dst[i + src.size()] == src[i]); |
| } |
| } |
| |
| // static source and dynamic destination span |
| { |
| std::array<short, 5> src{1, 2, 3, 4, 5}; |
| std::array<int, 10> dst{}; |
| |
| span<short, 5> src_span(src); |
| span<int> dst_span(dst); |
| |
| copy(src_span, dst_span); |
| copy(src_span, dst_span.subspan(src_span.size())); |
| |
| for (std::size_t i = 0; i < src.size(); ++i) { |
| CHECK(dst[i] == src[i]); |
| CHECK(dst[i + src.size()] == src[i]); |
| } |
| } |
| |
| // dynamic source and static destination span |
| { |
| std::array<short, 5> src{1, 2, 3, 4, 5}; |
| std::array<int, 10> dst{}; |
| |
| span<short> src_span(src); |
| span<int, 10> dst_span(dst); |
| |
| copy(src_span, dst_span); |
| copy(src_span, dst_span.subspan(src_span.size())); |
| |
| for (std::size_t i = 0; i < src.size(); ++i) { |
| CHECK(dst[i] == src[i]); |
| CHECK(dst[i + src.size()] == src[i]); |
| } |
| } |
| |
| // static source and destination span |
| { |
| std::array<short, 5> src{1, 2, 3, 4, 5}; |
| std::array<int, 10> dst{}; |
| |
| span<short, 5> src_span(src); |
| span<int, 10> dst_span(dst); |
| |
| copy(src_span, dst_span); |
| copy(src_span, dst_span.subspan(src_span.size())); |
| |
| for (std::size_t i = 0; i < src.size(); ++i) { |
| CHECK(dst[i] == src[i]); |
| CHECK(dst[i + src.size()] == src[i]); |
| } |
| } |
| } |
| |
| #ifdef CONFIRM_COMPILATION_ERRORS |
| TEST_CASE("incompatible_type") |
| { |
| std::array<int, 4> src{1, 2, 3, 4}; |
| std::array<int*, 12> dst{}; |
| |
| span<int> src_span_dyn(src); |
| span<int, 4> src_span_static(src); |
| span<int*> dst_span_dyn(dst); |
| span<int*, 4> dst_span_static(dst); |
| |
| // every line should produce a compilation error |
| copy(src_span_dyn, dst_span_dyn); |
| copy(src_span_dyn, dst_span_static); |
| copy(src_span_static, dst_span_dyn); |
| copy(src_span_static, dst_span_static); |
| } |
| #endif |
| |
| TEST_CASE("small_destination_span") |
| { |
| std::array<int, 12> src{1, 2, 3, 4}; |
| std::array<int, 4> dst{}; |
| |
| span<int> src_span_dyn(src); |
| span<int, 12> src_span_static(src); |
| span<int> dst_span_dyn(dst); |
| span<int, 4> dst_span_static(dst); |
| |
| CHECK_THROWS_AS(copy(src_span_dyn, dst_span_dyn), fail_fast); |
| CHECK_THROWS_AS(copy(src_span_dyn, dst_span_static), fail_fast); |
| CHECK_THROWS_AS(copy(src_span_static, dst_span_dyn), fail_fast); |
| |
| #ifdef CONFIRM_COMPILATION_ERRORS |
| copy(src_span_static, dst_span_static); |
| #endif |
| } |