1/* Copyright 2016-2017 Joaquin M Lopez Munoz.
2 * Distributed under the Boost Software License, Version 1.0.
3 * (See accompanying file LICENSE_1_0.txt or copy at
4 * http://www.boost.org/LICENSE_1_0.txt)
5 *
6 * See http://www.boost.org/libs/poly_collection for library home page.
7 */
8
9/* examples of insertion and emplacement */
10
11#include <algorithm>
12#include <array>
13#include <boost/poly_collection/base_collection.hpp>
14#include <random>
15#include "rolegame.hpp"
16
17int main()
18{
19 boost::base_collection<sprite> c;
20
21 // populate c
22
23 std::mt19937 gen{92748}; // some arbitrary random seed
24 std::discrete_distribution<> rnd{{1,1,1}};
25 for(int i=0;i<8;++i){ // assign each type with 1/3 probability
26 switch(rnd(gen)){
27 case 0: c.insert(x: warrior{i});break;
28 case 1: c.insert(x: juggernaut{i});break;
29 case 2: c.insert(x: goblin{i});break;
30 }
31 }
32
33 auto render=[](const boost::base_collection<sprite>& c){
34 const char* comma="";
35 for(const sprite& s:c){
36 std::cout<<comma;
37 s.render(os&: std::cout);
38 comma=",";
39 }
40 std::cout<<"\n";
41 };
42 render(c);
43
44//[insertion_emplacement_1]
45 c.insert(hint: c.begin(),x: juggernaut{8});
46//]
47 render(c);
48
49//[insertion_emplacement_2]
50 c.insert(hint: c.begin(),x: goblin{9});
51//]
52 render(c);
53
54//[insertion_emplacement_3]
55 c.insert(pos: c.begin<juggernaut>()+2,x: juggernaut{10});
56 // ^^ remember local iterators are random access
57//]
58 render(c);
59
60//[insertion_emplacement_4]
61//= c.insert(c.begin(typeid(warrior)),juggernaut{11}); // undefined behavior!!
62//]
63
64//[insertion_emplacement_5]
65 boost::base_collection<sprite> c2;
66
67 c2.insert(first: c.begin(),last: c.end()); // read below
68//<-
69 render(c2);
70//->
71
72 // add some more warriors
73 std::array<warrior,3> aw={._M_elems: {11,12,13}};
74 c2.insert(first: aw.begin(),last: aw.end());
75//<-
76 render(c2);
77//->
78
79 // add some goblins at the beginning of their segment
80 std::array<goblin,3> ag={._M_elems: {14,15,16}};
81 c2.insert(pos: c2.begin<goblin>(),first: ag.begin(),last: ag.end());
82//<-
83 render(c2);
84//->
85//]
86
87//[insertion_emplacement_6]
88//<-
89 // same as line at beginning of previous snippet
90//->
91 c2.insert(first: c.begin(),last: c.end());
92//]
93
94//[insertion_emplacement_7]
95//= c.emplace(11); // does not compile
96//]
97
98//[insertion_emplacement_8]
99 c.emplace<goblin>(args: 11); // now it works
100//]
101 render(c);
102
103//[insertion_emplacement_9]
104 c.emplace_hint<juggernaut>(hint: c.begin(),args: 12); // at the beginning if possible
105 c.emplace_pos<goblin>(pos: c.begin<goblin>()+2,args: 13); // amidst the goblins
106 c.emplace_pos<warrior>(pos: c.begin(info: typeid(warrior)),args: 14); // local_base_iterator
107//]
108 render(c);
109}
110

source code of boost/libs/poly_collection/example/insertion_emplacement.cpp