summaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite/24_iterators/headers/iterator/synopsis_c++20.cc
blob: 2c9062a52a0d2bb77ab531a873bb0cdf7b8d5ff3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright (C) 2019-2022 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3.  If not see
// <http://www.gnu.org/licenses/>.

// { dg-options "-std=gnu++2a" }
// { dg-do compile { target c++2a } }
// { dg-require-normal-namespace "" }

#include <iterator>
#include "./synopsis_c++17.cc"

namespace std
{
  template<class> struct incrementable_traits;
  template<class> struct readable_traits;

  struct contiguous_iterator_tag;

  namespace ranges
  {
    // These are function objects of unspecified type.
    auto& _distance = distance;
    auto& _advance = advance;
    auto& _next = next;
    auto& _prev = prev;
  }

  template<semiregular S> class move_sentinel;

  template<input_or_output_iterator I, sentinel_for<I> S>
    requires (!same_as<I, S>) && copyable<I>
    class common_iterator;

  template<class I, class S>
    struct incrementable_traits<common_iterator<I, S>>;

  template<input_iterator I, class S>
    struct iterator_traits<common_iterator<I, S>>;

  struct default_sentinel_t;

  template<input_or_output_iterator I> class counted_iterator;

  template<class I>
    struct incrementable_traits<counted_iterator<I>>;

  template<input_iterator I>
    requires same_as<__detail::__iter_traits<I>, iterator_traits<I>>
    struct iterator_traits<counted_iterator<I>>;

  struct unreachable_sentinel_t;
}

struct I { };
template<> constexpr bool std::disable_sized_sentinel_for<I, I> = true;

namespace __gnu_test
{
  // customization points
  constexpr auto* iter_move = &std::ranges::iter_move;
  constexpr auto* iter_swap = &std::ranges::iter_swap;
  // sized sentinels
  constexpr bool const* disable_sized_sentinel_for
    = &std::disable_sized_sentinel_for<void, void>;
  // default sentinels
  constexpr std::default_sentinel_t const* default_sentinel
    = &std::default_sentinel;
  // unreachable sentinels
  constexpr std::unreachable_sentinel_t const* unreachable_sentinel
    = &std::unreachable_sentinel;
}