made boost::unordered_[multi](map|set)::[const_][local_]iterator instantiable with incomplete value_type (#321)

* made boost::unordered_[multi](map|set)::[const_][local_]iterator instantiable with incomplete value_type
* qualified name to avoid self-definition
This commit is contained in:
joaquintides
2025-10-12 13:14:16 +02:00
committed by GitHub
parent 4b76ac84ec
commit 09d6416755
5 changed files with 159 additions and 35 deletions
+34 -8
View File
@@ -1,4 +1,4 @@
// Copyright (C) 2022-2024 Joaquin M Lopez Munoz.
// Copyright (C) 2022-2025 Joaquin M Lopez Munoz.
// Copyright (C) 2022 Christian Mazakas
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
@@ -134,11 +134,37 @@ namespace boost {
namespace unordered {
namespace detail {
template <class ValueType, class VoidPtr> struct node;
// access to node::value_type and node::pointer for incomplete node
template<class Node> struct node_value_type_impl;
template <class ValueType, class VoidPtr>
struct node_value_type_impl<node<ValueType, VoidPtr>>
{
typedef ValueType type;
};
template<class Node> using node_value_type =
typename node_value_type_impl<Node>::type;
template<class Node> struct node_pointer_impl;
template <class ValueType, class VoidPtr>
struct node_pointer_impl<node<ValueType, VoidPtr>>
{
typedef typename boost::pointer_traits<VoidPtr>::template rebind_to<
node<ValueType, VoidPtr>>::type type;
};
template<class Node> using node_pointer =
typename node_pointer_impl<Node>::type;
template <class ValueType, class VoidPtr> struct node
{
typedef ValueType value_type;
typedef typename boost::pointer_traits<VoidPtr>::template rebind_to<
node>::type node_pointer;
typedef node_value_type<node> value_type;
typedef detail::node_pointer<node> node_pointer;
node_pointer next;
opt_storage<value_type> buf;
@@ -304,10 +330,10 @@ namespace boost {
template <class Node> struct grouped_local_bucket_iterator
{
typedef typename Node::node_pointer node_pointer;
typedef detail::node_pointer<Node> node_pointer;
public:
typedef typename Node::value_type value_type;
typedef detail::node_value_type<Node> value_type;
typedef value_type element_type;
typedef value_type* pointer;
typedef value_type& reference;
@@ -370,10 +396,10 @@ namespace boost {
template <class Node> struct const_grouped_local_bucket_iterator
{
typedef typename Node::node_pointer node_pointer;
typedef detail::node_pointer<Node> node_pointer;
public:
typedef typename Node::value_type const value_type;
typedef detail::node_value_type<Node> const value_type;
typedef value_type const element_type;
typedef value_type const* pointer;
typedef value_type const& reference;
@@ -969,7 +969,7 @@ namespace boost {
template <class Node, class Bucket> class iterator
{
public:
typedef typename Node::value_type value_type;
typedef typename detail::node_value_type<Node> value_type;
typedef value_type element_type;
typedef value_type* pointer;
typedef value_type& reference;
@@ -1023,7 +1023,7 @@ namespace boost {
}
private:
typedef typename Node::node_pointer node_pointer;
typedef detail::node_pointer<Node> node_pointer;
typedef grouped_bucket_iterator<Bucket> bucket_iterator;
node_pointer p;
@@ -1076,7 +1076,7 @@ namespace boost {
template <class Node, class Bucket> class c_iterator
{
public:
typedef typename Node::value_type value_type;
typedef typename detail::node_value_type<Node> value_type;
typedef value_type const element_type;
typedef value_type const* pointer;
typedef value_type const& reference;
@@ -1131,7 +1131,7 @@ namespace boost {
}
private:
typedef typename Node::node_pointer node_pointer;
typedef detail::node_pointer<Node> node_pointer;
typedef grouped_bucket_iterator<Bucket> bucket_iterator;
node_pointer p;