/* Copyright 2016-2017 Joaquin M Lopez Munoz. * 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) * * See http://www.boost.org/libs/poly_collection for library home page. */ /* examples of insertion and emplacement */ #include #include #include #include #include "rolegame.hpp" int main() { boost::base_collection c; // populate c std::mt19937 gen{92748}; // some arbitrary random seed std::discrete_distribution<> rnd{{1,1,1}}; for(int i=0;i<8;++i){ // assign each type with 1/3 probability switch(rnd(gen)){ case 0: c.insert(warrior{i});break; case 1: c.insert(juggernaut{i});break; case 2: c.insert(goblin{i});break; } } auto render=[](const boost::base_collection& c){ const char* comma=""; for(const sprite& s:c){ std::cout<()+2,juggernaut{10}); // ^^ remember local iterators are random access //] render(c); //[insertion_emplacement_4] //= c.insert(c.begin(typeid(warrior)),juggernaut{11}); // undefined behavior!! //] //[insertion_emplacement_5] boost::base_collection c2; c2.insert(c.begin(),c.end()); // read below //<- render(c2); //-> // add some more warriors std::array aw={{11,12,13}}; c2.insert(aw.begin(),aw.end()); //<- render(c2); //-> // add some goblins at the beginning of their segment std::array ag={{14,15,16}}; c2.insert(c2.begin(),ag.begin(),ag.end()); //<- render(c2); //-> //] //[insertion_emplacement_6] //<- // same as line at beginning of previous snippet //-> c2.insert(c.begin(),c.end()); //] //[insertion_emplacement_7] //= c.emplace(11); // does not compile //] //[insertion_emplacement_8] c.emplace(11); // now it works //] render(c); //[insertion_emplacement_9] c.emplace_hint(c.begin(),12); // at the beginning if possible c.emplace_pos(c.begin()+2,13); // amidst the goblins c.emplace_pos(c.begin(typeid(warrior)),14); // local_base_iterator //] render(c); }