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