1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <algorithm>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12eb564e76cc3904d811c981a50ecce0659f444cc9Howard Hinnant// template<class Iter, IntegralLike Size, class T>
13eb564e76cc3904d811c981a50ecce0659f444cc9Howard Hinnant//   requires OutputIterator<Iter, const T&>
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   OutputIterator
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//   fill_n(Iter first, Size n, const T& value);
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <algorithm>
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
2083e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow#include "test_iterators.h"
215cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert#include "user_defined_integral.hpp"
225cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert
235cb52824fc2a0caf233311e91d9a2a53368f04adDan Alberttypedef UserDefinedIntegral<unsigned> UDI;
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class Iter>
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest_char()
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned n = 4;
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char ca[n] = {0};
315cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    assert(std::fill_n(Iter(ca), UDI(n), char(1)) == std::next(Iter(ca), n));
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ca[0] == 1);
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ca[1] == 1);
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ca[2] == 1);
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ca[3] == 1);
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class Iter>
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttest_int()
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const unsigned n = 4;
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int ia[n] = {0};
445cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    assert(std::fill_n(Iter(ia), UDI(n), 1) == std::next(Iter(ia), n));
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ia[0] == 1);
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ia[1] == 1);
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ia[2] == 1);
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    assert(ia[3] == 1);
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
51b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlssonvoid
52b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlssontest_int_array()
53b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson{
54b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    const unsigned n = 4;
55b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    int ia[n] = {0};
565cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    assert(std::fill_n(ia, UDI(n), static_cast<char>(1)) == std::next(ia, n));
57b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    assert(ia[0] == 1);
58b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    assert(ia[1] == 1);
59b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    assert(ia[2] == 1);
60b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    assert(ia[3] == 1);
61b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson}
62b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson
63b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlssonstruct source {
64b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    source() : i(0) { }
65b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson
66b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    operator int() const { return i++; }
67b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    mutable int i;
68b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson};
69b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson
70b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlssonvoid
71b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlssontest_int_array_struct_source()
72b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson{
73b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    const unsigned n = 4;
74b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    int ia[n] = {0};
755cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    assert(std::fill_n(ia, UDI(n), source()) == std::next(ia, n));
76b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    assert(ia[0] == 0);
77b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    assert(ia[1] == 1);
78b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    assert(ia[2] == 2);
79b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    assert(ia[3] == 3);
80b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson}
81b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson
82b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlssonstruct test1 {
83b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    test1() : c(0) { }
84b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    test1(char c) : c(c + 1) { }
85b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    char c;
86b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson};
87b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson
88b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlssonvoid
89b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlssontest_struct_array()
90b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson{
91b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    const unsigned n = 4;
92b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    test1 test1a[n] = {0};
935cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    assert(std::fill_n(test1a, UDI(n), static_cast<char>(10)) == std::next(test1a, n));
94b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    assert(test1a[0].c == 11);
95b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    assert(test1a[1].c == 11);
96b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    assert(test1a[2].c == 11);
97b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    assert(test1a[3].c == 11);
98b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson}
99b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson
10056dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnantclass A
10156dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant{
10256dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant    char a_;
10356dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnantpublic:
10456dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant    A() {}
10556dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant    explicit A(char a) : a_(a) {}
10656dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant    operator unsigned char() const {return 'b';}
10756dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant
10856dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant    friend bool operator==(const A& x, const A& y)
10956dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant        {return x.a_ == y.a_;}
11056dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant};
11156dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant
11256dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnantvoid
11356dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnanttest5()
11456dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant{
11556dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant    A a[3];
1165cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    assert(std::fill_n(&a[0], UDI(3), A('a')) == a+3);
11756dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant    assert(a[0] == A('a'));
11856dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant    assert(a[1] == A('a'));
11956dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant    assert(a[2] == A('a'));
12056dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant}
12156dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant
12256dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnantstruct Storage
12356dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant{
12456dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant  union
12556dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant  {
12656dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant    unsigned char a;
12756dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant    unsigned char b;
12856dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant  };
12956dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant};
1305cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert
13156dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnantvoid test6()
13256dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant{
13356dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant  Storage foo[5];
1345cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert  std::fill_n(&foo[0], UDI(5), Storage());
13556dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant}
13656dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant
13756dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test_char<forward_iterator<char*> >();
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test_char<bidirectional_iterator<char*> >();
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test_char<random_access_iterator<char*> >();
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test_char<char*>();
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test_int<forward_iterator<int*> >();
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test_int<bidirectional_iterator<int*> >();
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test_int<random_access_iterator<int*> >();
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    test_int<int*>();
1495cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert
150b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    test_int_array();
151b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    test_int_array_struct_source();
152b8e0d9086e4c4419f8ad07100c39869b366d3c5dAnders Carlsson    test_struct_array();
15356dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant
15456dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant    test5();
15556dcf0b8090bd82f3c7f94d14ea572384706f831Howard Hinnant    test6();
156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
157