Skip to content

Commit 1d0de7b

Browse files
committed
add value-initialization
1 parent 7809904 commit 1d0de7b

3 files changed

Lines changed: 12 additions & 15 deletions

File tree

doc/collections_as_container.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ In the following tables a convention from `Collection` is used: `iterator` stand
8383
| `std::indirectly_readable` | ❌ no | ❌ no |
8484
| `std::indirectly_writable` | ❌ no | ❌ no |
8585
| `std::weakly_incrementable` | ✔️ yes | ✔️ yes |
86-
| `std::incrementable` | ❌ no | ❌ no |
86+
| `std::incrementable` | ✔️ yes | ✔️ yes |
8787
| `std::input_or_output_iterator` | ✔️ yes | ✔️ yes |
8888
| `std::input_iterator` | ❌ no | ❌ no |
8989
| `std::output_iterator` | ❌ no | ❌ no |
@@ -134,10 +134,10 @@ In addition to the *LegacyForwardIterator* the C++ standard specifies also the *
134134
| Requirement | Fulfilled by `iterator`/`const_iterator`? | Comment |
135135
|-------------|-------------------------------------------|---------|
136136
| [*LegacyInputIterator*](https://en.cppreference.com/w/cpp/named_req/InputIterator) | ✔️ yes / ✔️ yes | [See above](#legacyinputiterator)|
137-
| [*DefaultConstructible*](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible) | ❌ no / ❌ no | Value initialization not defined |
137+
| [*DefaultConstructible*](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible) | ✔️ yes / ✔️ yes | |
138138
| If *mutable* iterator then `reference` same as `value_type&` or `value_type&&`, otherwise same as `const value_type&` or `const value_type&&` | ❌ no / ❌ no | `reference` type is not a reference (`&` or `&&`) |
139139
| [Multipass guarantee](https://en.cppreference.com/w/cpp/named_req/ForwardIterator) | ❌ no / ❌ no | References from dereferencing equal iterators aren't bound to the same object |
140-
| [Singular iterators](https://en.cppreference.com/w/cpp/named_req/ForwardIterator) | ❌ no / ❌ no | Value initialization not defined |
140+
| [Singular iterators](https://en.cppreference.com/w/cpp/named_req/ForwardIterator) | ✔️ yes / ✔️ yes | |
141141

142142
| Expression | Return type | Semantics | Fulfilled by `iterator`/`const_iterator`? | Comment |
143143
|------------|-------------|-----------|-------------------------------------------|---------|

python/templates/macros/iterator.jinja2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public:
1010
using iterator_category = std::input_iterator_tag;
1111

1212
{{ iterator_type }}(size_t index, const {{ class.bare_type }}ObjPointerContainer* collection) : m_index(index), m_object({{ ptr_init }}), m_collection(collection) {}
13+
{{ iterator_type }}(): {{ iterator_type }}(0, nullptr) {}
1314

1415
{{ iterator_type }}(const {{ iterator_type }}&) = default;
1516
{{ iterator_type }}({{ iterator_type }}&&) = default;

tests/unittests/std_interoperability.cpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ TEST_CASE("Collection and iterator concepts") {
415415
DOCUMENTED_STATIC_FAILURE(std::indirectly_readable<iterator>);
416416
DOCUMENTED_STATIC_FAILURE(std::indirectly_writable<iterator, CollectionType::value_type>);
417417
STATIC_REQUIRE(std::weakly_incrementable<iterator>);
418-
DOCUMENTED_STATIC_FAILURE(std::incrementable<iterator>);
418+
STATIC_REQUIRE(std::incrementable<iterator>);
419419
STATIC_REQUIRE(std::input_or_output_iterator<iterator>);
420420
DOCUMENTED_STATIC_FAILURE(std::input_iterator<iterator>);
421421
DOCUMENTED_STATIC_FAILURE(std::output_iterator<iterator, CollectionType::value_type>);
@@ -428,7 +428,7 @@ TEST_CASE("Collection and iterator concepts") {
428428
DOCUMENTED_STATIC_FAILURE(std::indirectly_readable<const_iterator>);
429429
DOCUMENTED_STATIC_FAILURE(std::indirectly_writable<const_iterator, CollectionType::value_type>);
430430
STATIC_REQUIRE(std::weakly_incrementable<const_iterator>);
431-
DOCUMENTED_STATIC_FAILURE(std::incrementable<const_iterator>);
431+
STATIC_REQUIRE(std::incrementable<const_iterator>);
432432
STATIC_REQUIRE(std::input_or_output_iterator<const_iterator>);
433433
DOCUMENTED_STATIC_FAILURE(std::input_iterator<const_iterator>);
434434
DOCUMENTED_STATIC_FAILURE(std::output_iterator<const_iterator, CollectionType::value_type>);
@@ -655,9 +655,9 @@ TEST_CASE("Collection iterators", "[collection][container][iterator][std]") {
655655

656656
// DefaultConstructible
657657
// iterator
658-
DOCUMENTED_STATIC_FAILURE(std::is_default_constructible_v<iterator>);
658+
STATIC_REQUIRE(std::is_default_constructible_v<iterator>);
659659
// const_iterator
660-
DOCUMENTED_STATIC_FAILURE(std::is_default_constructible_v<const_iterator>);
660+
STATIC_REQUIRE(std::is_default_constructible_v<const_iterator>);
661661

662662
// Multipass guarantee
663663
// iterator
@@ -704,16 +704,12 @@ TEST_CASE("Collection iterators", "[collection][container][iterator][std]") {
704704
// Singular iterators
705705
// iterator
706706
STATIC_REQUIRE(traits::has_equality_comparator_v<iterator>);
707-
DOCUMENTED_STATIC_FAILURE(std::is_default_constructible_v<iterator>);
708-
//{
709-
// REQUIRE(iterator{} == iterator{});
710-
//}
707+
STATIC_REQUIRE(std::is_default_constructible_v<iterator>);
708+
{ REQUIRE(iterator{} == iterator{}); }
711709
// const_iterator
712710
STATIC_REQUIRE(traits::has_equality_comparator_v<const_iterator>);
713-
DOCUMENTED_STATIC_FAILURE(std::is_default_constructible_v<const_iterator>);
714-
//{
715-
// REQUIRE(const_iterator{} == const_iterator{});
716-
//}
711+
STATIC_REQUIRE(std::is_default_constructible_v<const_iterator>);
712+
{ REQUIRE(const_iterator{} == const_iterator{}); }
717713

718714
// i++
719715
// iterator

0 commit comments

Comments
 (0)