File: output.cpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (151 lines) | stat: -rw-r--r-- 3,660 bytes parent folder | download | duplicates (8)
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// Copyright (C) 2019 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 <boost/core/lightweight_test.hpp>

#include <array>
#include <numeric>
#include <vector>
#include <type_traits>


struct basic_output_iter
    : boost::stl_interfaces::iterator_interface<
#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
          basic_output_iter,
#endif
          std::output_iterator_tag, int>
{
    basic_output_iter() : it_(nullptr) {}
    basic_output_iter(int * it) : it_(it) {}

    int & operator*() noexcept { return *it_; }
    basic_output_iter & operator++() noexcept
    {
        ++it_;
        return *this;
    }

    using base_type = boost::stl_interfaces::iterator_interface<
#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
        basic_output_iter,
#endif
        std::output_iterator_tag, int>;
    using base_type::operator++;

private:
    int * it_;
};

using output = basic_output_iter;

#if BOOST_STL_INTERFACES_USE_CONCEPTS
static_assert(std::output_iterator<output, int>, "");
BOOST_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS(
    output,
    void,
    std::output_iterator_tag,
    void,
    void,
    void,
    std::ptrdiff_t)
#else
BOOST_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS(
    output,
    std::output_iterator_tag,
    std::output_iterator_tag,
    int,
    int &,
    void,
    std::ptrdiff_t)
#endif


template<typename Container>
struct back_insert_iter : boost::stl_interfaces::iterator_interface<
#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
                              back_insert_iter<Container>,
#endif
                              std::output_iterator_tag,
                              typename Container::value_type,
                              back_insert_iter<Container> &>
{
    back_insert_iter() : c_(nullptr) {}
    back_insert_iter(Container & c) : c_(std::addressof(c)) {}

    back_insert_iter & operator*() noexcept { return *this; }
    back_insert_iter & operator++() noexcept { return *this; }

    back_insert_iter & operator=(typename Container::value_type const & v)
    {
        c_->push_back(v);
        return *this;
    }
    back_insert_iter & operator=(typename Container::value_type && v)
    {
        c_->push_back(std::move(v));
        return *this;
    }

    using base_type = boost::stl_interfaces::iterator_interface<
#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
        back_insert_iter<Container>,
#endif
        std::output_iterator_tag,
        typename Container::value_type,
        back_insert_iter<Container> &>;
    using base_type::operator++;

private:
    Container * c_;
};

using back_insert = back_insert_iter<std::vector<int>>;

#if BOOST_STL_INTERFACES_USE_CONCEPTS
static_assert(std::output_iterator<back_insert, int>, "");
BOOST_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS(
    back_insert,
    void,
    std::output_iterator_tag,
    void,
    void,
    void,
    std::ptrdiff_t)
#else
BOOST_STL_INTERFACES_STATIC_ASSERT_ITERATOR_TRAITS(
    back_insert,
    std::output_iterator_tag,
    std::output_iterator_tag,
    int,
    back_insert &,
    void,
    std::ptrdiff_t)
#endif


std::vector<int> ints = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};


int main()
{

{
    std::vector<int> ints_copy(ints.size());
    std::copy(ints.begin(), ints.end(), output(&ints_copy[0]));
    BOOST_TEST(ints_copy == ints);
}


{
    std::vector<int> ints_copy;
    std::copy(ints.begin(), ints.end(), back_insert(ints_copy));
    BOOST_TEST(ints_copy == ints);
}

    return boost::report_errors();
}