Add a test to cover #59 so that it does not pop up again.

Fixes #60.
This commit is contained in:
Zach Laine
2022-12-05 20:11:03 -06:00
parent 7dd2b97589
commit c157b1637a
4 changed files with 81 additions and 0 deletions

View File

@@ -49,6 +49,7 @@ add_executable(
compile_tests
compile_tests_main.cpp
compile_seq_cont_rvalue_constrained_pop_back.cpp
compile_sfinae_path_mutable_iterator.cpp
)
target_link_libraries(compile_tests stl_interfaces)
if (clang_on_linux)

View File

@@ -26,3 +26,4 @@ run random_access.cpp ;
run static_vec.cpp ;
compile compile_seq_cont_rvalue_constrained_pop_back.cpp ;
compile compile_sfinae_path_mutable_iterator.cpp ;

View File

@@ -0,0 +1,77 @@
// Copyright (C) 2022 T. Zachary Laine
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/stl_interfaces/iterator_interface.hpp>
#include <type_traits>
#include <utility>
struct node
{
using value_type = std::pair<int, int>;
value_type kv_;
node * next_;
};
template<typename Node>
struct iterator : boost::stl_interfaces::iterator_interface<
iterator<Node>,
std::forward_iterator_tag,
Node>
{
using value_type = typename Node::value_type;
constexpr iterator() noexcept = default;
constexpr explicit iterator(Node * it) : it_{it} {}
template<
typename Node2,
typename Enable = std::enable_if_t<
std::is_convertible_v<Node2 *, Node *> &&
!std::is_const_v<Node2> && std::is_const_v<Node>>>
constexpr iterator(iterator<Node2> other) noexcept : it_{other.it_}
{}
constexpr value_type const & operator*() const noexcept { return it_->kv_; }
template<
typename T = Node,
typename std::enable_if_t<!std::is_const_v<T>, bool> = true>
constexpr value_type & operator*() noexcept
{
return it_->kv_;
}
constexpr iterator & operator++() noexcept
{
it_ = it_->next_;
return *this;
}
using base_type = boost::stl_interfaces::iterator_interface<
iterator<Node>,
std::forward_iterator_tag,
Node>;
using base_type::operator++;
friend constexpr bool operator==(iterator lhs, iterator rhs) noexcept
{
return lhs.it_ == rhs.it_;
}
private:
Node * it_;
template<typename Node2>
friend struct iterator;
};
void compile_sfinae_path_mutable_iterator()
{
auto it = iterator<node>{};
if (it->first == 42) {
it->second = 13;
}
}

View File

@@ -4,8 +4,10 @@
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
void compile_seq_cont_constrained_pop_back();
void compile_sfinae_path_mutable_iterator();
int main()
{
compile_seq_cont_constrained_pop_back();
compile_sfinae_path_mutable_iterator();
}