mirror of
https://github.com/boostorg/stl_interfaces.git
synced 2026-01-19 04:42:12 +00:00
@@ -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)
|
||||
|
||||
@@ -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 ;
|
||||
|
||||
77
test/compile_sfinae_path_mutable_iterator.cpp
Normal file
77
test/compile_sfinae_path_mutable_iterator.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user