Home | History | Annotate | Download | only in multimap.modifiers
      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 // <map>
     11 
     12 // class multimap
     13 
     14 // template <class... Args>
     15 //   iterator emplace(Args&&... args);
     16 
     17 #include <map>
     18 #include <cassert>
     19 
     20 #include "../../../Emplaceable.h"
     21 #include "DefaultOnly.h"
     22 #include "min_allocator.h"
     23 
     24 int main()
     25 {
     26 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
     27     {
     28         typedef std::multimap<int, DefaultOnly> M;
     29         typedef M::iterator R;
     30         M m;
     31         assert(DefaultOnly::count == 0);
     32         R r = m.emplace();
     33         assert(r == m.begin());
     34         assert(m.size() == 1);
     35         assert(m.begin()->first == 0);
     36         assert(m.begin()->second == DefaultOnly());
     37         assert(DefaultOnly::count == 1);
     38         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
     39                                                 std::forward_as_tuple());
     40         assert(r == next(m.begin()));
     41         assert(m.size() == 2);
     42         assert(next(m.begin())->first == 1);
     43         assert(next(m.begin())->second == DefaultOnly());
     44         assert(DefaultOnly::count == 2);
     45         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
     46                                                 std::forward_as_tuple());
     47         assert(r == next(m.begin(), 2));
     48         assert(m.size() == 3);
     49         assert(next(m.begin(), 2)->first == 1);
     50         assert(next(m.begin(), 2)->second == DefaultOnly());
     51         assert(DefaultOnly::count == 3);
     52     }
     53     assert(DefaultOnly::count == 0);
     54     {
     55         typedef std::multimap<int, Emplaceable> M;
     56         typedef M::iterator R;
     57         M m;
     58         R r = m.emplace(std::piecewise_construct, std::forward_as_tuple(2),
     59                                                   std::forward_as_tuple());
     60         assert(r == m.begin());
     61         assert(m.size() == 1);
     62         assert(m.begin()->first == 2);
     63         assert(m.begin()->second == Emplaceable());
     64         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
     65                                                 std::forward_as_tuple(2, 3.5));
     66         assert(r == m.begin());
     67         assert(m.size() == 2);
     68         assert(m.begin()->first == 1);
     69         assert(m.begin()->second == Emplaceable(2, 3.5));
     70         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
     71                                                 std::forward_as_tuple(3, 3.5));
     72         assert(r == next(m.begin()));
     73         assert(m.size() == 3);
     74         assert(r->first == 1);
     75         assert(r->second == Emplaceable(3, 3.5));
     76     }
     77     {
     78         typedef std::multimap<int, double> M;
     79         typedef M::iterator R;
     80         M m;
     81         R r = m.emplace(M::value_type(2, 3.5));
     82         assert(r == m.begin());
     83         assert(m.size() == 1);
     84         assert(m.begin()->first == 2);
     85         assert(m.begin()->second == 3.5);
     86     }
     87 #if __cplusplus >= 201103L
     88     {
     89         typedef std::multimap<int, DefaultOnly, std::less<int>, min_allocator<std::pair<const int, DefaultOnly>>> M;
     90         typedef M::iterator R;
     91         M m;
     92         assert(DefaultOnly::count == 0);
     93         R r = m.emplace();
     94         assert(r == m.begin());
     95         assert(m.size() == 1);
     96         assert(m.begin()->first == 0);
     97         assert(m.begin()->second == DefaultOnly());
     98         assert(DefaultOnly::count == 1);
     99         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
    100                                                 std::forward_as_tuple());
    101         assert(r == next(m.begin()));
    102         assert(m.size() == 2);
    103         assert(next(m.begin())->first == 1);
    104         assert(next(m.begin())->second == DefaultOnly());
    105         assert(DefaultOnly::count == 2);
    106         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
    107                                                 std::forward_as_tuple());
    108         assert(r == next(m.begin(), 2));
    109         assert(m.size() == 3);
    110         assert(next(m.begin(), 2)->first == 1);
    111         assert(next(m.begin(), 2)->second == DefaultOnly());
    112         assert(DefaultOnly::count == 3);
    113     }
    114     assert(DefaultOnly::count == 0);
    115     {
    116         typedef std::multimap<int, Emplaceable, std::less<int>, min_allocator<std::pair<const int, Emplaceable>>> M;
    117         typedef M::iterator R;
    118         M m;
    119         R r = m.emplace(std::piecewise_construct, std::forward_as_tuple(2),
    120                                                   std::forward_as_tuple());
    121         assert(r == m.begin());
    122         assert(m.size() == 1);
    123         assert(m.begin()->first == 2);
    124         assert(m.begin()->second == Emplaceable());
    125         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
    126                                                 std::forward_as_tuple(2, 3.5));
    127         assert(r == m.begin());
    128         assert(m.size() == 2);
    129         assert(m.begin()->first == 1);
    130         assert(m.begin()->second == Emplaceable(2, 3.5));
    131         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
    132                                                 std::forward_as_tuple(3, 3.5));
    133         assert(r == next(m.begin()));
    134         assert(m.size() == 3);
    135         assert(r->first == 1);
    136         assert(r->second == Emplaceable(3, 3.5));
    137     }
    138     {
    139         typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
    140         typedef M::iterator R;
    141         M m;
    142         R r = m.emplace(M::value_type(2, 3.5));
    143         assert(r == m.begin());
    144         assert(m.size() == 1);
    145         assert(m.begin()->first == 2);
    146         assert(m.begin()->second == 3.5);
    147     }
    148 #endif
    149 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    150 }
    151