From f1d895e1fca12b5d7af8f81bb5e9febc0b495914 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 2 Apr 2018 18:47:31 +0200 Subject: [PATCH] [wip] --- src/Corrade/Containers/Array.h | 2 +- src/Corrade/Containers/ArrayView.h | 4 ++-- src/Corrade/Containers/StaticArray.h | 7 +++++++ src/Corrade/Containers/Test/ArrayViewTest.cpp | 19 +++++++++++++++---- .../Containers/Test/StaticArrayViewTest.cpp | 15 ++++++++++++++- 5 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/Corrade/Containers/Array.h b/src/Corrade/Containers/Array.h index f02b0a17c..da39cb14f 100644 --- a/src/Corrade/Containers/Array.h +++ b/src/Corrade/Containers/Array.h @@ -328,7 +328,7 @@ class Array { /** @brief Whether the array is non-empty */ /* Disabled on MSVC <= 2017 to avoid ambiguous operator+() when doing pointer arithmetic. */ - explicit operator bool() const { return _data; } + explicit operator bool() const { return _size; } #endif /** diff --git a/src/Corrade/Containers/ArrayView.h b/src/Corrade/Containers/ArrayView.h index 539f898b7..98b22ee57 100644 --- a/src/Corrade/Containers/ArrayView.h +++ b/src/Corrade/Containers/ArrayView.h @@ -148,7 +148,7 @@ template class ArrayView { /** @brief Whether the array is non-empty */ /* Disabled on MSVC <= 2017 to avoid ambiguous operator+() when doing pointer arithmetic. */ - explicit operator bool() const { return _data; } + explicit operator bool() const { return _size; } #endif /** @brief Conversion to array type */ @@ -497,7 +497,7 @@ template class StaticArrayView { /** @brief Whether the array is non-empty */ /* Disabled on MSVC <= 2017 to avoid ambiguous operator+() when doing pointer arithmetic. */ - explicit operator bool() const { return _data; } + constexpr explicit operator bool() const { return size_; } #endif /** @brief Conversion to array type */ diff --git a/src/Corrade/Containers/StaticArray.h b/src/Corrade/Containers/StaticArray.h index 02773cf99..8d68e9add 100644 --- a/src/Corrade/Containers/StaticArray.h +++ b/src/Corrade/Containers/StaticArray.h @@ -212,6 +212,13 @@ template class StaticArray { /** @brief Moving is not allowed */ StaticArray& operator=(StaticArray&&) = delete; + #ifndef CORRADE_MSVC2017_COMPATIBILITY + /** @brief Whether the array is non-empty */ + /* Disabled on MSVC <= 2017 to avoid ambiguous operator+() when doing + pointer arithmetic. */ + constexpr explicit operator bool() const { return size_; } + #endif + /** * @brief Convert to @ref ArrayView * diff --git a/src/Corrade/Containers/Test/ArrayViewTest.cpp b/src/Corrade/Containers/Test/ArrayViewTest.cpp index 55858c24f..308c5f39c 100644 --- a/src/Corrade/Containers/Test/ArrayViewTest.cpp +++ b/src/Corrade/Containers/Test/ArrayViewTest.cpp @@ -43,6 +43,7 @@ struct ArrayViewTest: TestSuite::Tester { void constructVoid(); void convertBool(); + void convertBoolNullptr(); void convertPointer(); void convertConst(); void convertVoid(); @@ -75,6 +76,7 @@ ArrayViewTest::ArrayViewTest() { &ArrayViewTest::constructVoid, &ArrayViewTest::convertBool, + &ArrayViewTest::convertBoolNullptr, &ArrayViewTest::convertPointer, &ArrayViewTest::convertConst, &ArrayViewTest::convertVoid, @@ -202,6 +204,15 @@ void ArrayViewTest::convertBool() { CORRADE_VERIFY(!(std::is_convertible::value)); } +void ArrayViewTest::convertBoolNullptr() { + /* Zero-sized slice of an array should convert to false, while three-item + array starting at 0 should convert to true. The documentation says + it returns true if nonempty. */ + int a[7]; + CORRADE_VERIFY(!(ArrayView{a, 0})); + CORRADE_VERIFY((ArrayView{nullptr, 5})); +} + void ArrayViewTest::convertPointer() { int a[7]; ArrayView b = a; @@ -321,22 +332,22 @@ void ArrayViewTest::sliceNullptr() { ArrayView a{nullptr, 5}; ArrayView b = a.prefix(nullptr); - CORRADE_VERIFY(!b); + CORRADE_VERIFY(!b.begin()); CORRADE_COMPARE(b.size(), 0); ArrayView c = a.suffix(nullptr); - CORRADE_VERIFY(!c); + CORRADE_VERIFY(!c.begin()); CORRADE_COMPARE(c.size(), 5); int data[5]; ArrayView d{data}; ArrayView e = d.prefix(nullptr); - CORRADE_VERIFY(!e); + CORRADE_VERIFY(!e.begin()); CORRADE_COMPARE(e.size(), 0); ArrayView f = d.suffix(nullptr); - CORRADE_VERIFY(!f); + CORRADE_VERIFY(!f.begin()); CORRADE_COMPARE(f.size(), 0); } diff --git a/src/Corrade/Containers/Test/StaticArrayViewTest.cpp b/src/Corrade/Containers/Test/StaticArrayViewTest.cpp index f934c1f32..c8b889746 100644 --- a/src/Corrade/Containers/Test/StaticArrayViewTest.cpp +++ b/src/Corrade/Containers/Test/StaticArrayViewTest.cpp @@ -41,6 +41,7 @@ struct StaticArrayViewTest: TestSuite::Tester { void constructConst(); void convertBool(); + void convertBoolNullptr(); void convertPointer(); void convertConst(); void convertVoid(); @@ -70,6 +71,7 @@ StaticArrayViewTest::StaticArrayViewTest() { &StaticArrayViewTest::constructConst, &StaticArrayViewTest::convertBool, + &StaticArrayViewTest::convertBoolNullptr, &StaticArrayViewTest::convertPointer, &StaticArrayViewTest::convertConst, &StaticArrayViewTest::convertVoid, @@ -158,10 +160,21 @@ void StaticArrayViewTest::constructConst() { void StaticArrayViewTest::convertBool() { int a[7]; CORRADE_VERIFY(StaticArrayView<5>{a}); - CORRADE_VERIFY(!StaticArrayView<5>{}); + /** @todo ISO C++ forbids zero-side array, can't really test */ + //CORRADE_VERIFY(StaticArrayView<0>{}); CORRADE_VERIFY(!(std::is_convertible, int>::value)); } +void StaticArrayViewTest::convertBoolNullptr() { + /* Zero-sized slice of an array should convert to false, while three-item + array starting at 0 should convert to true. The documentation says + it returns true if nonempty. */ + /** @todo ISO C++ forbids zero-side array, can't really test */ + //int a[7]; + //CORRADE_VERIFY(!StaticArrayView<5>{a}.slice<0>(1)); + CORRADE_VERIFY(StaticArrayView<5>{nullptr}); +} + void StaticArrayViewTest::convertPointer() { int a[7]; StaticArrayView<7> b = a;