1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <algorithm>
11 
12 // template<class Iter, IntegralLike Size, class T>
13 //   requires OutputIterator<Iter, const T&>
14 //   OutputIterator
15 //   fill_n(Iter first, Size n, const T& value);
16 
17 #include <algorithm>
18 #include <cassert>
19 
20 #include "test_iterators.h"
21 #include "user_defined_integral.hpp"
22 
23 typedef UserDefinedIntegral<unsigned> UDI;
24 
25 template <class Iter>
26 void
test_char()27 test_char()
28 {
29     const unsigned n = 4;
30     char ca[n] = {0};
31     assert(std::fill_n(Iter(ca), UDI(n), char(1)) == std::next(Iter(ca), n));
32     assert(ca[0] == 1);
33     assert(ca[1] == 1);
34     assert(ca[2] == 1);
35     assert(ca[3] == 1);
36 }
37 
38 template <class Iter>
39 void
test_int()40 test_int()
41 {
42     const unsigned n = 4;
43     int ia[n] = {0};
44     assert(std::fill_n(Iter(ia), UDI(n), 1) == std::next(Iter(ia), n));
45     assert(ia[0] == 1);
46     assert(ia[1] == 1);
47     assert(ia[2] == 1);
48     assert(ia[3] == 1);
49 }
50 
51 void
test_int_array()52 test_int_array()
53 {
54     const unsigned n = 4;
55     int ia[n] = {0};
56     assert(std::fill_n(ia, UDI(n), static_cast<char>(1)) == std::next(ia, n));
57     assert(ia[0] == 1);
58     assert(ia[1] == 1);
59     assert(ia[2] == 1);
60     assert(ia[3] == 1);
61 }
62 
63 struct source {
sourcesource64     source() : i(0) { }
65 
operator intsource66     operator int() const { return i++; }
67     mutable int i;
68 };
69 
70 void
test_int_array_struct_source()71 test_int_array_struct_source()
72 {
73     const unsigned n = 4;
74     int ia[n] = {0};
75     assert(std::fill_n(ia, UDI(n), source()) == std::next(ia, n));
76     assert(ia[0] == 0);
77     assert(ia[1] == 1);
78     assert(ia[2] == 2);
79     assert(ia[3] == 3);
80 }
81 
82 struct test1 {
test1test183     test1() : c(0) { }
test1test184     test1(char c) : c(c + 1) { }
85     char c;
86 };
87 
88 void
test_struct_array()89 test_struct_array()
90 {
91     const unsigned n = 4;
92     test1 test1a[n] = {0};
93     assert(std::fill_n(test1a, UDI(n), static_cast<char>(10)) == std::next(test1a, n));
94     assert(test1a[0].c == 11);
95     assert(test1a[1].c == 11);
96     assert(test1a[2].c == 11);
97     assert(test1a[3].c == 11);
98 }
99 
100 class A
101 {
102     char a_;
103 public:
A()104     A() {}
A(char a)105     explicit A(char a) : a_(a) {}
operator unsigned char() const106     operator unsigned char() const {return 'b';}
107 
operator ==(const A & x,const A & y)108     friend bool operator==(const A& x, const A& y)
109         {return x.a_ == y.a_;}
110 };
111 
112 void
test5()113 test5()
114 {
115     A a[3];
116     assert(std::fill_n(&a[0], UDI(3), A('a')) == a+3);
117     assert(a[0] == A('a'));
118     assert(a[1] == A('a'));
119     assert(a[2] == A('a'));
120 }
121 
122 struct Storage
123 {
124   union
125   {
126     unsigned char a;
127     unsigned char b;
128   };
129 };
130 
test6()131 void test6()
132 {
133   Storage foo[5];
134   std::fill_n(&foo[0], UDI(5), Storage());
135 }
136 
137 
main()138 int main()
139 {
140     test_char<forward_iterator<char*> >();
141     test_char<bidirectional_iterator<char*> >();
142     test_char<random_access_iterator<char*> >();
143     test_char<char*>();
144 
145     test_int<forward_iterator<int*> >();
146     test_int<bidirectional_iterator<int*> >();
147     test_int<random_access_iterator<int*> >();
148     test_int<int*>();
149 
150     test_int_array();
151     test_int_array_struct_source();
152     test_struct_array();
153 
154     test5();
155     test6();
156 }
157