Move test into test/std subdirectory.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@224658 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Fiselier
2014-12-20 01:40:03 +00:00
parent 669a8a5a19
commit a90c6dd460
4817 changed files with 13 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef COPYABLE_H
#define COPYABLE_H
class Copyable
{
public:
};
#endif // COPYABLE_H

View File

@@ -0,0 +1,54 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef EMPLACEABLE_H
#define EMPLACEABLE_H
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
class Emplaceable
{
Emplaceable(const Emplaceable&);
Emplaceable& operator=(const Emplaceable&);
int int_;
double double_;
public:
Emplaceable() : int_(0), double_(0) {}
Emplaceable(int i, double d) : int_(i), double_(d) {}
Emplaceable(Emplaceable&& x)
: int_(x.int_), double_(x.double_)
{x.int_ = 0; x.double_ = 0;}
Emplaceable& operator=(Emplaceable&& x)
{int_ = x.int_; x.int_ = 0;
double_ = x.double_; x.double_ = 0;
return *this;}
bool operator==(const Emplaceable& x) const
{return int_ == x.int_ && double_ == x.double_;}
bool operator<(const Emplaceable& x) const
{return int_ < x.int_ || (int_ == x.int_ && double_ < x.double_);}
int get() const {return int_;}
};
namespace std {
template <>
struct hash<Emplaceable>
: public std::unary_function<Emplaceable, std::size_t>
{
std::size_t operator()(const Emplaceable& x) const {return x.get();}
};
}
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
#endif // EMPLACEABLE_H

View File

@@ -0,0 +1,50 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MOVEONLY_H
#define MOVEONLY_H
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
#include <cstddef>
#include <functional>
class MoveOnly
{
MoveOnly(const MoveOnly&);
MoveOnly& operator=(const MoveOnly&);
int data_;
public:
MoveOnly(int data = 1) : data_(data) {}
MoveOnly(MoveOnly&& x)
: data_(x.data_) {x.data_ = 0;}
MoveOnly& operator=(MoveOnly&& x)
{data_ = x.data_; x.data_ = 0; return *this;}
int get() const {return data_;}
bool operator==(const MoveOnly& x) const {return data_ == x.data_;}
bool operator< (const MoveOnly& x) const {return data_ < x.data_;}
};
namespace std {
template <>
struct hash<MoveOnly>
: public std::unary_function<MoveOnly, std::size_t>
{
std::size_t operator()(const MoveOnly& x) const {return x.get();}
};
}
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
#endif // MOVEONLY_H

View File

@@ -0,0 +1,39 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef NOTCONSTRUCTIBLE_H
#define NOTCONSTRUCTIBLE_H
#include <functional>
class NotConstructible
{
NotConstructible(const NotConstructible&);
NotConstructible& operator=(const NotConstructible&);
public:
};
inline
bool
operator==(const NotConstructible&, const NotConstructible&)
{return true;}
namespace std
{
template <>
struct hash<NotConstructible>
: public std::unary_function<NotConstructible, std::size_t>
{
std::size_t operator()(const NotConstructible&) const {return 0;}
};
}
#endif // NOTCONSTRUCTIBLE_H

View File

@@ -0,0 +1,32 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// template <class Key, class T, class Compare = less<Key>,
// class Allocator = allocator<pair<const Key, T>>>
// class map
// http://llvm.org/bugs/show_bug.cgi?id=16538
// http://llvm.org/bugs/show_bug.cgi?id=16549
#include <map>
struct Key {
template <typename T> Key(const T&) {}
bool operator< (const Key&) const { return false; }
};
int
main()
{
std::map<Key, int>::iterator it = std::map<Key, int>().find(Key(0));
std::pair<std::map<Key, int>::iterator, bool> result =
std::map<Key, int>().insert(std::make_pair(Key(0), 0));
}

View File

@@ -0,0 +1,154 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// mapped_type& at(const key_type& k);
// const mapped_type& at(const key_type& k) const;
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1.5),
V(2, 2.5),
V(3, 3.5),
V(4, 4.5),
V(5, 5.5),
V(7, 7.5),
V(8, 8.5),
};
std::map<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 7);
assert(m.at(1) == 1.5);
m.at(1) = -1.5;
assert(m.at(1) == -1.5);
assert(m.at(2) == 2.5);
assert(m.at(3) == 3.5);
assert(m.at(4) == 4.5);
assert(m.at(5) == 5.5);
try
{
m.at(6);
assert(false);
}
catch (std::out_of_range&)
{
}
assert(m.at(7) == 7.5);
assert(m.at(8) == 8.5);
assert(m.size() == 7);
}
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1.5),
V(2, 2.5),
V(3, 3.5),
V(4, 4.5),
V(5, 5.5),
V(7, 7.5),
V(8, 8.5),
};
const std::map<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 7);
assert(m.at(1) == 1.5);
assert(m.at(2) == 2.5);
assert(m.at(3) == 3.5);
assert(m.at(4) == 4.5);
assert(m.at(5) == 5.5);
try
{
m.at(6);
assert(false);
}
catch (std::out_of_range&)
{
}
assert(m.at(7) == 7.5);
assert(m.at(8) == 8.5);
assert(m.size() == 7);
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1.5),
V(2, 2.5),
V(3, 3.5),
V(4, 4.5),
V(5, 5.5),
V(7, 7.5),
V(8, 8.5),
};
std::map<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 7);
assert(m.at(1) == 1.5);
m.at(1) = -1.5;
assert(m.at(1) == -1.5);
assert(m.at(2) == 2.5);
assert(m.at(3) == 3.5);
assert(m.at(4) == 4.5);
assert(m.at(5) == 5.5);
try
{
m.at(6);
assert(false);
}
catch (std::out_of_range&)
{
}
assert(m.at(7) == 7.5);
assert(m.at(8) == 8.5);
assert(m.size() == 7);
}
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1.5),
V(2, 2.5),
V(3, 3.5),
V(4, 4.5),
V(5, 5.5),
V(7, 7.5),
V(8, 8.5),
};
const std::map<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 7);
assert(m.at(1) == 1.5);
assert(m.at(2) == 2.5);
assert(m.at(3) == 3.5);
assert(m.at(4) == 4.5);
assert(m.at(5) == 5.5);
try
{
m.at(6);
assert(false);
}
catch (std::out_of_range&)
{
}
assert(m.at(7) == 7.5);
assert(m.at(8) == 8.5);
assert(m.size() == 7);
}
#endif
}

View File

@@ -0,0 +1,43 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// bool empty() const;
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::map<int, double> M;
M m;
assert(m.empty());
m.insert(M::value_type(1, 1.5));
assert(!m.empty());
m.clear();
assert(m.empty());
}
#if __cplusplus >= 201103L
{
typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
M m;
assert(m.empty());
m.insert(M::value_type(1, 1.5));
assert(!m.empty());
m.clear();
assert(m.empty());
}
#endif
}

View File

@@ -0,0 +1,105 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// mapped_type& operator[](const key_type& k);
#include <map>
#include <cassert>
#include "min_allocator.h"
#include "private_constructor.hpp"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1.5),
V(2, 2.5),
V(3, 3.5),
V(4, 4.5),
V(5, 5.5),
V(7, 7.5),
V(8, 8.5),
};
std::map<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 7);
assert(m[1] == 1.5);
assert(m.size() == 7);
m[1] = -1.5;
assert(m[1] == -1.5);
assert(m.size() == 7);
assert(m[6] == 0);
assert(m.size() == 8);
m[6] = 6.5;
assert(m[6] == 6.5);
assert(m.size() == 8);
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1.5),
V(2, 2.5),
V(3, 3.5),
V(4, 4.5),
V(5, 5.5),
V(7, 7.5),
V(8, 8.5),
};
std::map<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 7);
assert(m[1] == 1.5);
assert(m.size() == 7);
const int i = 1;
m[i] = -1.5;
assert(m[1] == -1.5);
assert(m.size() == 7);
assert(m[6] == 0);
assert(m.size() == 8);
m[6] = 6.5;
assert(m[6] == 6.5);
assert(m.size() == 8);
}
#endif
#if _LIBCPP_STD_VER > 11
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1.5),
V(2, 2.5),
V(3, 3.5),
V(4, 4.5),
V(5, 5.5),
V(7, 7.5),
V(8, 8.5),
};
std::map<int, double, std::less<>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 7);
assert(m[1] == 1.5);
assert(m.size() == 7);
m[1] = -1.5;
assert(m[1] == -1.5);
assert(m.size() == 7);
assert(m[6] == 0);
assert(m.size() == 8);
m[6] = 6.5;
assert(m[6] == 6.5);
assert(m.size() == 8);
}
#endif
}

View File

@@ -0,0 +1,58 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// mapped_type& operator[](key_type&& k);
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
typedef std::pair<MoveOnly, double> V;
std::map<MoveOnly, double> m;
assert(m.size() == 0);
assert(m[1] == 0.0);
assert(m.size() == 1);
m[1] = -1.5;
assert(m[1] == -1.5);
assert(m.size() == 1);
assert(m[6] == 0);
assert(m.size() == 2);
m[6] = 6.5;
assert(m[6] == 6.5);
assert(m.size() == 2);
}
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
#if __cplusplus >= 201103L
{
typedef std::pair<MoveOnly, double> V;
std::map<MoveOnly, double, std::less<MoveOnly>, min_allocator<V>> m;
assert(m.size() == 0);
assert(m[1] == 0.0);
assert(m.size() == 1);
m[1] = -1.5;
assert(m[1] == -1.5);
assert(m.size() == 1);
assert(m[6] == 0);
assert(m.size() == 2);
m[6] = 6.5;
assert(m[6] == 6.5);
assert(m.size() == 2);
}
#endif
}

View File

@@ -0,0 +1,33 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// mapped_type& operator[](const key_type& k);
// http://llvm.org/bugs/show_bug.cgi?id=16542
#include <map>
#ifndef _LIBCPP_HAS_NO_VARIADICS
#include <tuple>
#endif
int main()
{
#ifndef _LIBCPP_HAS_NO_VARIADICS
using namespace std;
map<tuple<int,int>, size_t> m;
m[make_tuple(2,3)]=7;
#endif
}

View File

@@ -0,0 +1,227 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// iterator begin();
// const_iterator begin() const;
// iterator end();
// const_iterator end() const;
//
// reverse_iterator rbegin();
// const_reverse_iterator rbegin() const;
// reverse_iterator rend();
// const_reverse_iterator rend() const;
//
// const_iterator cbegin() const;
// const_iterator cend() const;
// const_reverse_iterator crbegin() const;
// const_reverse_iterator crend() const;
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
V(4, 1),
V(4, 1.5),
V(4, 2),
V(5, 1),
V(5, 1.5),
V(5, 2),
V(6, 1),
V(6, 1.5),
V(6, 2),
V(7, 1),
V(7, 1.5),
V(7, 2),
V(8, 1),
V(8, 1.5),
V(8, 2)
};
std::map<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(std::distance(m.begin(), m.end()) == m.size());
assert(std::distance(m.rbegin(), m.rend()) == m.size());
std::map<int, double>::iterator i;
i = m.begin();
std::map<int, double>::const_iterator k = i;
assert(i == k);
for (int j = 1; j <= m.size(); ++j, ++i)
{
assert(i->first == j);
assert(i->second == 1);
i->second = 2.5;
assert(i->second == 2.5);
}
}
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
V(4, 1),
V(4, 1.5),
V(4, 2),
V(5, 1),
V(5, 1.5),
V(5, 2),
V(6, 1),
V(6, 1.5),
V(6, 2),
V(7, 1),
V(7, 1.5),
V(7, 2),
V(8, 1),
V(8, 1.5),
V(8, 2)
};
const std::map<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(std::distance(m.begin(), m.end()) == m.size());
assert(std::distance(m.cbegin(), m.cend()) == m.size());
assert(std::distance(m.rbegin(), m.rend()) == m.size());
assert(std::distance(m.crbegin(), m.crend()) == m.size());
std::map<int, double>::const_iterator i;
i = m.begin();
for (int j = 1; j <= m.size(); ++j, ++i)
{
assert(i->first == j);
assert(i->second == 1);
}
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
V(4, 1),
V(4, 1.5),
V(4, 2),
V(5, 1),
V(5, 1.5),
V(5, 2),
V(6, 1),
V(6, 1.5),
V(6, 2),
V(7, 1),
V(7, 1.5),
V(7, 2),
V(8, 1),
V(8, 1.5),
V(8, 2)
};
std::map<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(std::distance(m.begin(), m.end()) == m.size());
assert(std::distance(m.rbegin(), m.rend()) == m.size());
std::map<int, double, std::less<int>, min_allocator<V>>::iterator i;
i = m.begin();
std::map<int, double, std::less<int>, min_allocator<V>>::const_iterator k = i;
assert(i == k);
for (int j = 1; j <= m.size(); ++j, ++i)
{
assert(i->first == j);
assert(i->second == 1);
i->second = 2.5;
assert(i->second == 2.5);
}
}
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
V(4, 1),
V(4, 1.5),
V(4, 2),
V(5, 1),
V(5, 1.5),
V(5, 2),
V(6, 1),
V(6, 1.5),
V(6, 2),
V(7, 1),
V(7, 1.5),
V(7, 2),
V(8, 1),
V(8, 1.5),
V(8, 2)
};
const std::map<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(std::distance(m.begin(), m.end()) == m.size());
assert(std::distance(m.cbegin(), m.cend()) == m.size());
assert(std::distance(m.rbegin(), m.rend()) == m.size());
assert(std::distance(m.crbegin(), m.crend()) == m.size());
std::map<int, double, std::less<int>, min_allocator<V>>::const_iterator i;
i = m.begin();
for (int j = 1; j <= m.size(); ++j, ++i)
{
assert(i->first == j);
assert(i->second == 1);
}
}
#endif
#if _LIBCPP_STD_VER > 11
{ // N3644 testing
typedef std::map<int, double> C;
C::iterator ii1{}, ii2{};
C::iterator ii4 = ii1;
C::const_iterator cii{};
assert ( ii1 == ii2 );
assert ( ii1 == ii4 );
assert (!(ii1 != ii2 ));
assert ( (ii1 == cii ));
assert ( (cii == ii1 ));
assert (!(ii1 != cii ));
assert (!(cii != ii1 ));
}
#endif
}

View File

@@ -0,0 +1,35 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// size_type max_size() const;
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::map<int, double> M;
M m;
assert(m.max_size() != 0);
}
#if __cplusplus >= 201103L
{
typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
M m;
assert(m.max_size() != 0);
}
#endif
}

View File

@@ -0,0 +1,59 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// size_type size() const;
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::map<int, double> M;
M m;
assert(m.size() == 0);
m.insert(M::value_type(2, 1.5));
assert(m.size() == 1);
m.insert(M::value_type(1, 1.5));
assert(m.size() == 2);
m.insert(M::value_type(3, 1.5));
assert(m.size() == 3);
m.erase(m.begin());
assert(m.size() == 2);
m.erase(m.begin());
assert(m.size() == 1);
m.erase(m.begin());
assert(m.size() == 0);
}
#if __cplusplus >= 201103L
{
typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
M m;
assert(m.size() == 0);
m.insert(M::value_type(2, 1.5));
assert(m.size() == 1);
m.insert(M::value_type(1, 1.5));
assert(m.size() == 2);
m.insert(M::value_type(3, 1.5));
assert(m.size() == 3);
m.erase(m.begin());
assert(m.size() == 2);
m.erase(m.begin());
assert(m.size() == 1);
m.erase(m.begin());
assert(m.size() == 0);
}
#endif
}

View File

@@ -0,0 +1,42 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// explicit map(const allocator_type& a);
#include <map>
#include <cassert>
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
{
typedef std::less<int> C;
typedef test_allocator<std::pair<const int, double> > A;
std::map<int, double, C, A> m(A(5));
assert(m.empty());
assert(m.begin() == m.end());
assert(m.get_allocator() == A(5));
}
#if __cplusplus >= 201103L
{
typedef std::less<int> C;
typedef min_allocator<std::pair<const int, double> > A;
std::map<int, double, C, A> m(A{});
assert(m.empty());
assert(m.begin() == m.end());
assert(m.get_allocator() == A());
}
#endif
}

View File

@@ -0,0 +1,75 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// map& operator=(initializer_list<value_type> il);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
{
typedef std::pair<const int, double> V;
std::map<int, double> m =
{
{20, 1},
};
m =
{
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
};
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
std::map<int, double, std::less<int>, min_allocator<V>> m =
{
{20, 1},
};
m =
{
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
};
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
}
#endif
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
}

View File

@@ -0,0 +1,40 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// explicit map(const key_compare& comp);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "min_allocator.h"
int main()
{
{
typedef test_compare<std::less<int> > C;
std::map<int, double, C> m(C(3));
assert(m.empty());
assert(m.begin() == m.end());
assert(m.key_comp() == C(3));
}
#if __cplusplus >= 201103L
{
typedef test_compare<std::less<int> > C;
std::map<int, double, C, min_allocator<std::pair<const int, double>>> m(C(3));
assert(m.empty());
assert(m.begin() == m.end());
assert(m.key_comp() == C(3));
}
#endif
}

View File

@@ -0,0 +1,45 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// map(const key_compare& comp, const allocator_type& a);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
{
typedef test_compare<std::less<int> > C;
typedef test_allocator<std::pair<const int, double> > A;
std::map<int, double, C, A> m(C(4), A(5));
assert(m.empty());
assert(m.begin() == m.end());
assert(m.key_comp() == C(4));
assert(m.get_allocator() == A(5));
}
#if __cplusplus >= 201103L
{
typedef test_compare<std::less<int> > C;
typedef min_allocator<std::pair<const int, double> > A;
std::map<int, double, C, A> m(C(4), A());
assert(m.empty());
assert(m.begin() == m.end());
assert(m.key_comp() == C(4));
assert(m.get_allocator() == A());
}
#endif
}

View File

@@ -0,0 +1,131 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// map(const map& m);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef test_allocator<V> A;
std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(7));
std::map<int, double, C, A> m = mo;
assert(m.get_allocator() == A(7));
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(mo.get_allocator() == A(7));
assert(mo.key_comp() == C(5));
assert(mo.size() == 3);
assert(distance(mo.begin(), mo.end()) == 3);
assert(*mo.begin() == V(1, 1));
assert(*next(mo.begin()) == V(2, 1));
assert(*next(mo.begin(), 2) == V(3, 1));
}
#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef other_allocator<V> A;
std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(7));
std::map<int, double, C, A> m = mo;
assert(m.get_allocator() == A(-2));
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(mo.get_allocator() == A(7));
assert(mo.key_comp() == C(5));
assert(mo.size() == 3);
assert(distance(mo.begin(), mo.end()) == 3);
assert(*mo.begin() == V(1, 1));
assert(*next(mo.begin()) == V(2, 1));
assert(*next(mo.begin(), 2) == V(3, 1));
}
#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef min_allocator<V> A;
std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A());
std::map<int, double, C, A> m = mo;
assert(m.get_allocator() == A());
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(mo.get_allocator() == A());
assert(mo.key_comp() == C(5));
assert(mo.size() == 3);
assert(distance(mo.begin(), mo.end()) == 3);
assert(*mo.begin() == V(1, 1));
assert(*next(mo.begin()) == V(2, 1));
assert(*next(mo.begin(), 2) == V(3, 1));
}
#endif
}

View File

@@ -0,0 +1,95 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// map(const map& m, const allocator_type& a);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef test_allocator<V> A;
std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(7));
std::map<int, double, C, A> m(mo, A(3));
assert(m.get_allocator() == A(3));
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(mo.get_allocator() == A(7));
assert(mo.key_comp() == C(5));
assert(mo.size() == 3);
assert(distance(mo.begin(), mo.end()) == 3);
assert(*mo.begin() == V(1, 1));
assert(*next(mo.begin()) == V(2, 1));
assert(*next(mo.begin(), 2) == V(3, 1));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef min_allocator<V> A;
std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A());
std::map<int, double, C, A> m(mo, A());
assert(m.get_allocator() == A());
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(mo.get_allocator() == A());
assert(mo.key_comp() == C(5));
assert(mo.size() == 3);
assert(distance(mo.begin(), mo.end()) == 3);
assert(*mo.begin() == V(1, 1));
assert(*next(mo.begin()) == V(2, 1));
assert(*next(mo.begin(), 2) == V(3, 1));
}
#endif
}

View File

@@ -0,0 +1,182 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// map& operator=(const map& m);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2)
};
typedef test_compare<std::less<int> > C;
typedef test_allocator<V> A;
std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(2));
std::map<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0])/2, C(3), A(7));
m = mo;
assert(m.get_allocator() == A(7));
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(mo.get_allocator() == A(2));
assert(mo.key_comp() == C(5));
assert(mo.size() == 3);
assert(distance(mo.begin(), mo.end()) == 3);
assert(*mo.begin() == V(1, 1));
assert(*next(mo.begin()) == V(2, 1));
assert(*next(mo.begin(), 2) == V(3, 1));
}
{
typedef std::pair<const int, double> V;
const V ar[] =
{
V(1, 1),
V(2, 1),
V(3, 1),
};
std::map<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
std::map<int, double> *p = &m;
m = *p;
assert(m.size() == 3);
assert(std::equal(m.begin(), m.end(), ar));
}
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2)
};
typedef test_compare<std::less<int> > C;
typedef other_allocator<V> A;
std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(2));
std::map<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0])/2, C(3), A(7));
m = mo;
assert(m.get_allocator() == A(2));
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(mo.get_allocator() == A(2));
assert(mo.key_comp() == C(5));
assert(mo.size() == 3);
assert(distance(mo.begin(), mo.end()) == 3);
assert(*mo.begin() == V(1, 1));
assert(*next(mo.begin()) == V(2, 1));
assert(*next(mo.begin(), 2) == V(3, 1));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2)
};
typedef test_compare<std::less<int> > C;
typedef min_allocator<V> A;
std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A());
std::map<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0])/2, C(3), A());
m = mo;
assert(m.get_allocator() == A());
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(mo.get_allocator() == A());
assert(mo.key_comp() == C(5));
assert(mo.size() == 3);
assert(distance(mo.begin(), mo.end()) == 3);
assert(*mo.begin() == V(1, 1));
assert(*next(mo.begin()) == V(2, 1));
assert(*next(mo.begin(), 2) == V(3, 1));
}
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2)
};
typedef test_compare<std::less<int> > C;
typedef min_allocator<V> A;
std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A());
std::map<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0])/2, C(3), A());
m = mo;
assert(m.get_allocator() == A());
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(mo.get_allocator() == A());
assert(mo.key_comp() == C(5));
assert(mo.size() == 3);
assert(distance(mo.begin(), mo.end()) == 3);
assert(*mo.begin() == V(1, 1));
assert(*next(mo.begin()) == V(2, 1));
assert(*next(mo.begin(), 2) == V(3, 1));
}
#endif
}

View File

@@ -0,0 +1,40 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// map();
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
std::map<int, double> m;
assert(m.empty());
assert(m.begin() == m.end());
}
#if __cplusplus >= 201103L
{
std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> m;
assert(m.empty());
assert(m.begin() == m.end());
}
{
std::map<int, double> m = {};
assert(m.empty());
assert(m.begin() == m.end());
}
#endif
}

View File

@@ -0,0 +1,53 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// map()
// noexcept(
// is_nothrow_default_constructible<allocator_type>::value &&
// is_nothrow_default_constructible<key_compare>::value &&
// is_nothrow_copy_constructible<key_compare>::value);
// This tests a conforming extension
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "test_allocator.h"
template <class T>
struct some_comp
{
typedef T value_type;
some_comp();
};
int main()
{
#if __has_feature(cxx_noexcept)
{
typedef std::map<MoveOnly, MoveOnly> C;
static_assert(std::is_nothrow_default_constructible<C>::value, "");
}
{
typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C;
static_assert(std::is_nothrow_default_constructible<C>::value, "");
}
{
typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C;
static_assert(!std::is_nothrow_default_constructible<C>::value, "");
}
{
typedef std::map<MoveOnly, MoveOnly, some_comp<MoveOnly>> C;
static_assert(!std::is_nothrow_default_constructible<C>::value, "");
}
#endif
}

View File

@@ -0,0 +1,29 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// map();
#include <map>
#if !__has_feature(cxx_noexcept)
struct X
{
std::map<int, X> m;
};
#endif
int main()
{
}

View File

@@ -0,0 +1,51 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// ~map() // implied noexcept;
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "test_allocator.h"
#if __has_feature(cxx_noexcept)
template <class T>
struct some_comp
{
typedef T value_type;
~some_comp() noexcept(false);
};
#endif
int main()
{
#if __has_feature(cxx_noexcept)
{
typedef std::map<MoveOnly, MoveOnly> C;
static_assert(std::is_nothrow_destructible<C>::value, "");
}
{
typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C;
static_assert(std::is_nothrow_destructible<C>::value, "");
}
{
typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C;
static_assert(std::is_nothrow_destructible<C>::value, "");
}
{
typedef std::map<MoveOnly, MoveOnly, some_comp<MoveOnly>> C;
static_assert(!std::is_nothrow_destructible<C>::value, "");
}
#endif
}

View File

@@ -0,0 +1,67 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// map(initializer_list<value_type> il);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
{
typedef std::pair<const int, double> V;
std::map<int, double> m =
{
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
};
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
std::map<int, double, std::less<int>, min_allocator<V>> m =
{
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
};
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
}
#endif
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
}

View File

@@ -0,0 +1,69 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// map(initializer_list<value_type> il, const key_compare& comp);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
{
typedef std::pair<const int, double> V;
typedef test_compare<std::less<int> > C;
std::map<int, double, C> m({
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
}, C(3));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(m.key_comp() == C(3));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
typedef test_compare<std::less<int> > C;
std::map<int, double, C, min_allocator<std::pair<const int, double>>> m({
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
}, C(3));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(m.key_comp() == C(3));
}
#endif
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
}

View File

@@ -0,0 +1,100 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
{
typedef std::pair<const int, double> V;
typedef test_compare<std::less<int> > C;
typedef test_allocator<std::pair<const int, double> > A;
std::map<int, double, C, A> m({
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
}, C(3), A(6));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(m.key_comp() == C(3));
assert(m.get_allocator() == A(6));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
typedef test_compare<std::less<int> > C;
typedef min_allocator<std::pair<const int, double> > A;
std::map<int, double, C, A> m({
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
}, C(3), A());
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(m.key_comp() == C(3));
assert(m.get_allocator() == A());
}
#if _LIBCPP_STD_VER > 11
{
typedef std::pair<const int, double> V;
typedef min_allocator<V> A;
typedef test_compare<std::less<int> > C;
typedef std::map<int, double, C, A> M;
A a;
M m ({ {1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
}, a);
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(m.get_allocator() == a);
}
#endif
#endif
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
}

View File

@@ -0,0 +1,68 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// template <class InputIterator>
// map(InputIterator first, InputIterator last);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
std::map<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
}
#endif
}

View File

@@ -0,0 +1,73 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// template <class InputIterator>
// map(InputIterator first, InputIterator last, const key_compare& comp);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
std::map<int, double, C> m(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5));
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
std::map<int, double, C, min_allocator<std::pair<const int, double>>> m(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5));
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
}
#endif
}

View File

@@ -0,0 +1,108 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// template <class InputIterator>
// map(InputIterator first, InputIterator last,
// const key_compare& comp, const allocator_type& a);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef test_allocator<V> A;
std::map<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(7));
assert(m.get_allocator() == A(7));
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef min_allocator<V> A;
std::map<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A());
assert(m.get_allocator() == A());
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
}
#if _LIBCPP_STD_VER > 11
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef std::pair<const int, double> V;
typedef min_allocator<V> A;
typedef test_compare<std::less<int> > C;
A a;
std::map<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0]), a );
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(m.get_allocator() == a);
}
#endif
#endif
}

View File

@@ -0,0 +1,120 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// map(map&& m);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
typedef std::pair<const int, double> V;
{
typedef test_compare<std::less<int> > C;
typedef test_allocator<V> A;
std::map<int, double, C, A> mo(C(5), A(7));
std::map<int, double, C, A> m = std::move(mo);
assert(m.get_allocator() == A(7));
assert(m.key_comp() == C(5));
assert(m.size() == 0);
assert(distance(m.begin(), m.end()) == 0);
assert(mo.get_allocator() == A(7));
assert(mo.key_comp() == C(5));
assert(mo.size() == 0);
assert(distance(mo.begin(), mo.end()) == 0);
}
{
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef test_allocator<V> A;
std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(7));
std::map<int, double, C, A> m = std::move(mo);
assert(m.get_allocator() == A(7));
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(mo.get_allocator() == A(7));
assert(mo.key_comp() == C(5));
assert(mo.size() == 0);
assert(distance(mo.begin(), mo.end()) == 0);
}
#if __cplusplus >= 201103L
{
typedef test_compare<std::less<int> > C;
typedef min_allocator<V> A;
std::map<int, double, C, A> mo(C(5), A());
std::map<int, double, C, A> m = std::move(mo);
assert(m.get_allocator() == A());
assert(m.key_comp() == C(5));
assert(m.size() == 0);
assert(distance(m.begin(), m.end()) == 0);
assert(mo.get_allocator() == A());
assert(mo.key_comp() == C(5));
assert(mo.size() == 0);
assert(distance(mo.begin(), mo.end()) == 0);
}
{
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef min_allocator<V> A;
std::map<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A());
std::map<int, double, C, A> m = std::move(mo);
assert(m.get_allocator() == A());
assert(m.key_comp() == C(5));
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
assert(mo.get_allocator() == A());
assert(mo.key_comp() == C(5));
assert(mo.size() == 0);
assert(distance(mo.begin(), mo.end()) == 0);
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,186 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// map(map&& m, const allocator_type& a);
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef test_allocator<VC> A;
typedef std::map<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
M m3(std::move(m1), A(7));
assert(m3 == m2);
assert(m3.get_allocator() == A(7));
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef test_allocator<VC> A;
typedef std::map<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
M m3(std::move(m1), A(5));
assert(m3 == m2);
assert(m3.get_allocator() == A(5));
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef other_allocator<VC> A;
typedef std::map<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
M m3(std::move(m1), A(5));
assert(m3 == m2);
assert(m3.get_allocator() == A(5));
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
#if __cplusplus >= 201103L
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef min_allocator<VC> A;
typedef std::map<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A());
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A());
M m3(std::move(m1), A());
assert(m3 == m2);
assert(m3.get_allocator() == A());
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,190 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// map& operator=(map&& m);
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef test_allocator<VC> A;
typedef std::map<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
M m3(C(3), A(7));
m3 = std::move(m1);
assert(m3 == m2);
assert(m3.get_allocator() == A(7));
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef test_allocator<VC> A;
typedef std::map<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
M m3(C(3), A(5));
m3 = std::move(m1);
assert(m3 == m2);
assert(m3.get_allocator() == A(5));
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef other_allocator<VC> A;
typedef std::map<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
M m3(C(3), A(5));
m3 = std::move(m1);
assert(m3 == m2);
assert(m3.get_allocator() == A(7));
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
#if __cplusplus >= 201103L
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef min_allocator<VC> A;
typedef std::map<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A());
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A());
M m3(C(3), A());
m3 = std::move(m1);
assert(m3 == m2);
assert(m3.get_allocator() == A());
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,53 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// map& operator=(map&& c)
// noexcept(
// allocator_type::propagate_on_container_move_assignment::value &&
// is_nothrow_move_assignable<allocator_type>::value &&
// is_nothrow_move_assignable<key_compare>::value);
// This tests a conforming extension
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "test_allocator.h"
template <class T>
struct some_comp
{
typedef T value_type;
some_comp& operator=(const some_comp&);
};
int main()
{
#if __has_feature(cxx_noexcept)
{
typedef std::map<MoveOnly, MoveOnly> C;
static_assert(std::is_nothrow_move_assignable<C>::value, "");
}
{
typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C;
static_assert(!std::is_nothrow_move_assignable<C>::value, "");
}
{
typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C;
static_assert(std::is_nothrow_move_assignable<C>::value, "");
}
{
typedef std::map<MoveOnly, MoveOnly, some_comp<MoveOnly>> C;
static_assert(!std::is_nothrow_move_assignable<C>::value, "");
}
#endif
}

View File

@@ -0,0 +1,51 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// map(map&&)
// noexcept(is_nothrow_move_constructible<allocator_type>::value &&
// is_nothrow_move_constructible<key_compare>::value);
// This tests a conforming extension
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "test_allocator.h"
template <class T>
struct some_comp
{
typedef T value_type;
some_comp(const some_comp&);
};
int main()
{
#if __has_feature(cxx_noexcept)
{
typedef std::map<MoveOnly, MoveOnly> C;
static_assert(std::is_nothrow_move_constructible<C>::value, "");
}
{
typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C;
static_assert(std::is_nothrow_move_constructible<C>::value, "");
}
{
typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C;
static_assert(std::is_nothrow_move_constructible<C>::value, "");
}
{
typedef std::map<MoveOnly, MoveOnly, some_comp<MoveOnly>> C;
static_assert(!std::is_nothrow_move_constructible<C>::value, "");
}
#endif
}

View File

@@ -0,0 +1,63 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// void clear();
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::map<int, double> M;
typedef std::pair<int, double> P;
P ar[] =
{
P(1, 1.5),
P(2, 2.5),
P(3, 3.5),
P(4, 4.5),
P(5, 5.5),
P(6, 6.5),
P(7, 7.5),
P(8, 8.5),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 8);
m.clear();
assert(m.size() == 0);
}
#if __cplusplus >= 201103L
{
typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef std::pair<int, double> P;
P ar[] =
{
P(1, 1.5),
P(2, 2.5),
P(3, 3.5),
P(4, 4.5),
P(5, 5.5),
P(6, 6.5),
P(7, 7.5),
P(8, 8.5),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 8);
m.clear();
assert(m.size() == 0);
}
#endif
}

View File

@@ -0,0 +1,165 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// template <class... Args>
// pair<iterator, bool> emplace(Args&&... args);
#include <map>
#include <cassert>
#include <tuple>
#include "../../../Emplaceable.h"
#include "DefaultOnly.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
typedef std::map<int, DefaultOnly> M;
typedef std::pair<M::iterator, bool> R;
M m;
assert(DefaultOnly::count == 0);
R r = m.emplace();
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 0);
assert(m.begin()->second == DefaultOnly());
assert(DefaultOnly::count == 1);
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r.second);
assert(r.first == next(m.begin()));
assert(m.size() == 2);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == DefaultOnly());
assert(DefaultOnly::count == 2);
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple());
assert(!r.second);
assert(r.first == next(m.begin()));
assert(m.size() == 2);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == DefaultOnly());
assert(DefaultOnly::count == 2);
}
assert(DefaultOnly::count == 0);
{
typedef std::map<int, Emplaceable> M;
typedef std::pair<M::iterator, bool> R;
M m;
R r = m.emplace(std::piecewise_construct, std::forward_as_tuple(2),
std::forward_as_tuple());
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == Emplaceable());
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple(2, 3.5));
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 2);
assert(m.begin()->first == 1);
assert(m.begin()->second == Emplaceable(2, 3.5));
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple(2, 3.5));
assert(!r.second);
assert(r.first == m.begin());
assert(m.size() == 2);
assert(m.begin()->first == 1);
assert(m.begin()->second == Emplaceable(2, 3.5));
}
{
typedef std::map<int, double> M;
typedef std::pair<M::iterator, bool> R;
M m;
R r = m.emplace(M::value_type(2, 3.5));
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 3.5);
}
#if __cplusplus >= 201103L
{
typedef std::map<int, DefaultOnly, std::less<int>, min_allocator<std::pair<const int, DefaultOnly>>> M;
typedef std::pair<M::iterator, bool> R;
M m;
assert(DefaultOnly::count == 0);
R r = m.emplace();
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 0);
assert(m.begin()->second == DefaultOnly());
assert(DefaultOnly::count == 1);
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r.second);
assert(r.first == next(m.begin()));
assert(m.size() == 2);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == DefaultOnly());
assert(DefaultOnly::count == 2);
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple());
assert(!r.second);
assert(r.first == next(m.begin()));
assert(m.size() == 2);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == DefaultOnly());
assert(DefaultOnly::count == 2);
}
assert(DefaultOnly::count == 0);
{
typedef std::map<int, Emplaceable, std::less<int>, min_allocator<std::pair<const int, Emplaceable>>> M;
typedef std::pair<M::iterator, bool> R;
M m;
R r = m.emplace(std::piecewise_construct, std::forward_as_tuple(2),
std::forward_as_tuple());
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == Emplaceable());
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple(2, 3.5));
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 2);
assert(m.begin()->first == 1);
assert(m.begin()->second == Emplaceable(2, 3.5));
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple(2, 3.5));
assert(!r.second);
assert(r.first == m.begin());
assert(m.size() == 2);
assert(m.begin()->first == 1);
assert(m.begin()->second == Emplaceable(2, 3.5));
}
{
typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef std::pair<M::iterator, bool> R;
M m;
R r = m.emplace(M::value_type(2, 3.5));
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 3.5);
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,160 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// template <class... Args>
// iterator emplace_hint(const_iterator position, Args&&... args);
#include <map>
#include <cassert>
#include "../../../Emplaceable.h"
#include "DefaultOnly.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
typedef std::map<int, DefaultOnly> M;
typedef M::iterator R;
M m;
assert(DefaultOnly::count == 0);
R r = m.emplace_hint(m.end());
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 0);
assert(m.begin()->second == DefaultOnly());
assert(DefaultOnly::count == 1);
r = m.emplace_hint(m.end(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r == next(m.begin()));
assert(m.size() == 2);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == DefaultOnly());
assert(DefaultOnly::count == 2);
r = m.emplace_hint(m.end(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r == next(m.begin()));
assert(m.size() == 2);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == DefaultOnly());
assert(DefaultOnly::count == 2);
}
assert(DefaultOnly::count == 0);
{
typedef std::map<int, Emplaceable> M;
typedef M::iterator R;
M m;
R r = m.emplace_hint(m.end(), std::piecewise_construct,
std::forward_as_tuple(2),
std::forward_as_tuple());
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == Emplaceable());
r = m.emplace_hint(m.end(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(2, 3.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(m.begin()->first == 1);
assert(m.begin()->second == Emplaceable(2, 3.5));
r = m.emplace_hint(m.end(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(2, 3.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(m.begin()->first == 1);
assert(m.begin()->second == Emplaceable(2, 3.5));
}
{
typedef std::map<int, double> M;
typedef M::iterator R;
M m;
R r = m.emplace_hint(m.end(), M::value_type(2, 3.5));
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 3.5);
}
#if __cplusplus >= 201103L
{
typedef std::map<int, DefaultOnly, std::less<int>, min_allocator<std::pair<const int, DefaultOnly>>> M;
typedef M::iterator R;
M m;
assert(DefaultOnly::count == 0);
R r = m.emplace_hint(m.end());
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 0);
assert(m.begin()->second == DefaultOnly());
assert(DefaultOnly::count == 1);
r = m.emplace_hint(m.end(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r == next(m.begin()));
assert(m.size() == 2);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == DefaultOnly());
assert(DefaultOnly::count == 2);
r = m.emplace_hint(m.end(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r == next(m.begin()));
assert(m.size() == 2);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == DefaultOnly());
assert(DefaultOnly::count == 2);
}
assert(DefaultOnly::count == 0);
{
typedef std::map<int, Emplaceable, std::less<int>, min_allocator<std::pair<const int, Emplaceable>>> M;
typedef M::iterator R;
M m;
R r = m.emplace_hint(m.end(), std::piecewise_construct,
std::forward_as_tuple(2),
std::forward_as_tuple());
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == Emplaceable());
r = m.emplace_hint(m.end(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(2, 3.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(m.begin()->first == 1);
assert(m.begin()->second == Emplaceable(2, 3.5));
r = m.emplace_hint(m.end(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(2, 3.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(m.begin()->first == 1);
assert(m.begin()->second == Emplaceable(2, 3.5));
}
{
typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef M::iterator R;
M m;
R r = m.emplace_hint(m.end(), M::value_type(2, 3.5));
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 3.5);
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,237 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// iterator erase(const_iterator position);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::map<int, double> M;
typedef std::pair<int, double> P;
typedef M::iterator I;
P ar[] =
{
P(1, 1.5),
P(2, 2.5),
P(3, 3.5),
P(4, 4.5),
P(5, 5.5),
P(6, 6.5),
P(7, 7.5),
P(8, 8.5),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 8);
I i = m.erase(next(m.cbegin(), 3));
assert(m.size() == 7);
assert(i == next(m.begin(), 3));
assert(m.begin()->first == 1);
assert(m.begin()->second == 1.5);
assert(next(m.begin())->first == 2);
assert(next(m.begin())->second == 2.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 3.5);
assert(next(m.begin(), 3)->first == 5);
assert(next(m.begin(), 3)->second == 5.5);
assert(next(m.begin(), 4)->first == 6);
assert(next(m.begin(), 4)->second == 6.5);
assert(next(m.begin(), 5)->first == 7);
assert(next(m.begin(), 5)->second == 7.5);
assert(next(m.begin(), 6)->first == 8);
assert(next(m.begin(), 6)->second == 8.5);
i = m.erase(next(m.cbegin(), 0));
assert(m.size() == 6);
assert(i == m.begin());
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 3);
assert(next(m.begin())->second == 3.5);
assert(next(m.begin(), 2)->first == 5);
assert(next(m.begin(), 2)->second == 5.5);
assert(next(m.begin(), 3)->first == 6);
assert(next(m.begin(), 3)->second == 6.5);
assert(next(m.begin(), 4)->first == 7);
assert(next(m.begin(), 4)->second == 7.5);
assert(next(m.begin(), 5)->first == 8);
assert(next(m.begin(), 5)->second == 8.5);
i = m.erase(next(m.cbegin(), 5));
assert(m.size() == 5);
assert(i == m.end());
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 3);
assert(next(m.begin())->second == 3.5);
assert(next(m.begin(), 2)->first == 5);
assert(next(m.begin(), 2)->second == 5.5);
assert(next(m.begin(), 3)->first == 6);
assert(next(m.begin(), 3)->second == 6.5);
assert(next(m.begin(), 4)->first == 7);
assert(next(m.begin(), 4)->second == 7.5);
i = m.erase(next(m.cbegin(), 1));
assert(m.size() == 4);
assert(i == next(m.begin()));
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 5);
assert(next(m.begin())->second == 5.5);
assert(next(m.begin(), 2)->first == 6);
assert(next(m.begin(), 2)->second == 6.5);
assert(next(m.begin(), 3)->first == 7);
assert(next(m.begin(), 3)->second == 7.5);
i = m.erase(next(m.cbegin(), 2));
assert(m.size() == 3);
assert(i == next(m.begin(), 2));
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 5);
assert(next(m.begin())->second == 5.5);
assert(next(m.begin(), 2)->first == 7);
assert(next(m.begin(), 2)->second == 7.5);
i = m.erase(next(m.cbegin(), 2));
assert(m.size() == 2);
assert(i == next(m.begin(), 2));
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 5);
assert(next(m.begin())->second == 5.5);
i = m.erase(next(m.cbegin(), 0));
assert(m.size() == 1);
assert(i == next(m.begin(), 0));
assert(m.begin()->first == 5);
assert(m.begin()->second == 5.5);
i = m.erase(m.cbegin());
assert(m.size() == 0);
assert(i == m.begin());
assert(i == m.end());
}
#if __cplusplus >= 201103L
{
typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef std::pair<int, double> P;
typedef M::iterator I;
P ar[] =
{
P(1, 1.5),
P(2, 2.5),
P(3, 3.5),
P(4, 4.5),
P(5, 5.5),
P(6, 6.5),
P(7, 7.5),
P(8, 8.5),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 8);
I i = m.erase(next(m.cbegin(), 3));
assert(m.size() == 7);
assert(i == next(m.begin(), 3));
assert(m.begin()->first == 1);
assert(m.begin()->second == 1.5);
assert(next(m.begin())->first == 2);
assert(next(m.begin())->second == 2.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 3.5);
assert(next(m.begin(), 3)->first == 5);
assert(next(m.begin(), 3)->second == 5.5);
assert(next(m.begin(), 4)->first == 6);
assert(next(m.begin(), 4)->second == 6.5);
assert(next(m.begin(), 5)->first == 7);
assert(next(m.begin(), 5)->second == 7.5);
assert(next(m.begin(), 6)->first == 8);
assert(next(m.begin(), 6)->second == 8.5);
i = m.erase(next(m.cbegin(), 0));
assert(m.size() == 6);
assert(i == m.begin());
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 3);
assert(next(m.begin())->second == 3.5);
assert(next(m.begin(), 2)->first == 5);
assert(next(m.begin(), 2)->second == 5.5);
assert(next(m.begin(), 3)->first == 6);
assert(next(m.begin(), 3)->second == 6.5);
assert(next(m.begin(), 4)->first == 7);
assert(next(m.begin(), 4)->second == 7.5);
assert(next(m.begin(), 5)->first == 8);
assert(next(m.begin(), 5)->second == 8.5);
i = m.erase(next(m.cbegin(), 5));
assert(m.size() == 5);
assert(i == m.end());
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 3);
assert(next(m.begin())->second == 3.5);
assert(next(m.begin(), 2)->first == 5);
assert(next(m.begin(), 2)->second == 5.5);
assert(next(m.begin(), 3)->first == 6);
assert(next(m.begin(), 3)->second == 6.5);
assert(next(m.begin(), 4)->first == 7);
assert(next(m.begin(), 4)->second == 7.5);
i = m.erase(next(m.cbegin(), 1));
assert(m.size() == 4);
assert(i == next(m.begin()));
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 5);
assert(next(m.begin())->second == 5.5);
assert(next(m.begin(), 2)->first == 6);
assert(next(m.begin(), 2)->second == 6.5);
assert(next(m.begin(), 3)->first == 7);
assert(next(m.begin(), 3)->second == 7.5);
i = m.erase(next(m.cbegin(), 2));
assert(m.size() == 3);
assert(i == next(m.begin(), 2));
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 5);
assert(next(m.begin())->second == 5.5);
assert(next(m.begin(), 2)->first == 7);
assert(next(m.begin(), 2)->second == 7.5);
i = m.erase(next(m.cbegin(), 2));
assert(m.size() == 2);
assert(i == next(m.begin(), 2));
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 5);
assert(next(m.begin())->second == 5.5);
i = m.erase(next(m.cbegin(), 0));
assert(m.size() == 1);
assert(i == next(m.begin(), 0));
assert(m.begin()->first == 5);
assert(m.begin()->second == 5.5);
i = m.erase(m.cbegin());
assert(m.size() == 0);
assert(i == m.begin());
assert(i == m.end());
}
#endif
}

View File

@@ -0,0 +1,157 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// iterator erase(const_iterator first, const_iterator last);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::map<int, double> M;
typedef std::pair<int, double> P;
typedef M::iterator I;
P ar[] =
{
P(1, 1.5),
P(2, 2.5),
P(3, 3.5),
P(4, 4.5),
P(5, 5.5),
P(6, 6.5),
P(7, 7.5),
P(8, 8.5),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 8);
I i = m.erase(m.cbegin(), m.cbegin());
assert(m.size() == 8);
assert(i == m.begin());
assert(m.begin()->first == 1);
assert(m.begin()->second == 1.5);
assert(next(m.begin())->first == 2);
assert(next(m.begin())->second == 2.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 3.5);
assert(next(m.begin(), 3)->first == 4);
assert(next(m.begin(), 3)->second == 4.5);
assert(next(m.begin(), 4)->first == 5);
assert(next(m.begin(), 4)->second == 5.5);
assert(next(m.begin(), 5)->first == 6);
assert(next(m.begin(), 5)->second == 6.5);
assert(next(m.begin(), 6)->first == 7);
assert(next(m.begin(), 6)->second == 7.5);
assert(next(m.begin(), 7)->first == 8);
assert(next(m.begin(), 7)->second == 8.5);
i = m.erase(m.cbegin(), next(m.cbegin(), 2));
assert(m.size() == 6);
assert(i == m.begin());
assert(next(m.begin(), 0)->first == 3);
assert(next(m.begin(), 0)->second == 3.5);
assert(next(m.begin(), 1)->first == 4);
assert(next(m.begin(), 1)->second == 4.5);
assert(next(m.begin(), 2)->first == 5);
assert(next(m.begin(), 2)->second == 5.5);
assert(next(m.begin(), 3)->first == 6);
assert(next(m.begin(), 3)->second == 6.5);
assert(next(m.begin(), 4)->first == 7);
assert(next(m.begin(), 4)->second == 7.5);
assert(next(m.begin(), 5)->first == 8);
assert(next(m.begin(), 5)->second == 8.5);
i = m.erase(next(m.cbegin(), 2), next(m.cbegin(), 6));
assert(m.size() == 2);
assert(i == next(m.begin(), 2));
assert(next(m.begin(), 0)->first == 3);
assert(next(m.begin(), 0)->second == 3.5);
assert(next(m.begin(), 1)->first == 4);
assert(next(m.begin(), 1)->second == 4.5);
i = m.erase(m.cbegin(), m.cend());
assert(m.size() == 0);
assert(i == m.begin());
assert(i == m.end());
}
#if __cplusplus >= 201103L
{
typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef std::pair<int, double> P;
typedef M::iterator I;
P ar[] =
{
P(1, 1.5),
P(2, 2.5),
P(3, 3.5),
P(4, 4.5),
P(5, 5.5),
P(6, 6.5),
P(7, 7.5),
P(8, 8.5),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 8);
I i = m.erase(m.cbegin(), m.cbegin());
assert(m.size() == 8);
assert(i == m.begin());
assert(m.begin()->first == 1);
assert(m.begin()->second == 1.5);
assert(next(m.begin())->first == 2);
assert(next(m.begin())->second == 2.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 3.5);
assert(next(m.begin(), 3)->first == 4);
assert(next(m.begin(), 3)->second == 4.5);
assert(next(m.begin(), 4)->first == 5);
assert(next(m.begin(), 4)->second == 5.5);
assert(next(m.begin(), 5)->first == 6);
assert(next(m.begin(), 5)->second == 6.5);
assert(next(m.begin(), 6)->first == 7);
assert(next(m.begin(), 6)->second == 7.5);
assert(next(m.begin(), 7)->first == 8);
assert(next(m.begin(), 7)->second == 8.5);
i = m.erase(m.cbegin(), next(m.cbegin(), 2));
assert(m.size() == 6);
assert(i == m.begin());
assert(next(m.begin(), 0)->first == 3);
assert(next(m.begin(), 0)->second == 3.5);
assert(next(m.begin(), 1)->first == 4);
assert(next(m.begin(), 1)->second == 4.5);
assert(next(m.begin(), 2)->first == 5);
assert(next(m.begin(), 2)->second == 5.5);
assert(next(m.begin(), 3)->first == 6);
assert(next(m.begin(), 3)->second == 6.5);
assert(next(m.begin(), 4)->first == 7);
assert(next(m.begin(), 4)->second == 7.5);
assert(next(m.begin(), 5)->first == 8);
assert(next(m.begin(), 5)->second == 8.5);
i = m.erase(next(m.cbegin(), 2), next(m.cbegin(), 6));
assert(m.size() == 2);
assert(i == next(m.begin(), 2));
assert(next(m.begin(), 0)->first == 3);
assert(next(m.begin(), 0)->second == 3.5);
assert(next(m.begin(), 1)->first == 4);
assert(next(m.begin(), 1)->second == 4.5);
i = m.erase(m.cbegin(), m.cend());
assert(m.size() == 0);
assert(i == m.begin());
assert(i == m.end());
}
#endif
}

View File

@@ -0,0 +1,275 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// size_type erase(const key_type& k);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::map<int, double> M;
typedef std::pair<int, double> P;
typedef M::size_type R;
P ar[] =
{
P(1, 1.5),
P(2, 2.5),
P(3, 3.5),
P(4, 4.5),
P(5, 5.5),
P(6, 6.5),
P(7, 7.5),
P(8, 8.5),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 8);
R s = m.erase(9);
assert(s == 0);
assert(m.size() == 8);
assert(m.begin()->first == 1);
assert(m.begin()->second == 1.5);
assert(next(m.begin())->first == 2);
assert(next(m.begin())->second == 2.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 3.5);
assert(next(m.begin(), 3)->first == 4);
assert(next(m.begin(), 3)->second == 4.5);
assert(next(m.begin(), 4)->first == 5);
assert(next(m.begin(), 4)->second == 5.5);
assert(next(m.begin(), 5)->first == 6);
assert(next(m.begin(), 5)->second == 6.5);
assert(next(m.begin(), 6)->first == 7);
assert(next(m.begin(), 6)->second == 7.5);
assert(next(m.begin(), 7)->first == 8);
assert(next(m.begin(), 7)->second == 8.5);
s = m.erase(4);
assert(m.size() == 7);
assert(s == 1);
assert(m.begin()->first == 1);
assert(m.begin()->second == 1.5);
assert(next(m.begin())->first == 2);
assert(next(m.begin())->second == 2.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 3.5);
assert(next(m.begin(), 3)->first == 5);
assert(next(m.begin(), 3)->second == 5.5);
assert(next(m.begin(), 4)->first == 6);
assert(next(m.begin(), 4)->second == 6.5);
assert(next(m.begin(), 5)->first == 7);
assert(next(m.begin(), 5)->second == 7.5);
assert(next(m.begin(), 6)->first == 8);
assert(next(m.begin(), 6)->second == 8.5);
s = m.erase(1);
assert(m.size() == 6);
assert(s == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 3);
assert(next(m.begin())->second == 3.5);
assert(next(m.begin(), 2)->first == 5);
assert(next(m.begin(), 2)->second == 5.5);
assert(next(m.begin(), 3)->first == 6);
assert(next(m.begin(), 3)->second == 6.5);
assert(next(m.begin(), 4)->first == 7);
assert(next(m.begin(), 4)->second == 7.5);
assert(next(m.begin(), 5)->first == 8);
assert(next(m.begin(), 5)->second == 8.5);
s = m.erase(8);
assert(m.size() == 5);
assert(s == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 3);
assert(next(m.begin())->second == 3.5);
assert(next(m.begin(), 2)->first == 5);
assert(next(m.begin(), 2)->second == 5.5);
assert(next(m.begin(), 3)->first == 6);
assert(next(m.begin(), 3)->second == 6.5);
assert(next(m.begin(), 4)->first == 7);
assert(next(m.begin(), 4)->second == 7.5);
s = m.erase(3);
assert(m.size() == 4);
assert(s == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 5);
assert(next(m.begin())->second == 5.5);
assert(next(m.begin(), 2)->first == 6);
assert(next(m.begin(), 2)->second == 6.5);
assert(next(m.begin(), 3)->first == 7);
assert(next(m.begin(), 3)->second == 7.5);
s = m.erase(6);
assert(m.size() == 3);
assert(s == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 5);
assert(next(m.begin())->second == 5.5);
assert(next(m.begin(), 2)->first == 7);
assert(next(m.begin(), 2)->second == 7.5);
s = m.erase(7);
assert(m.size() == 2);
assert(s == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 5);
assert(next(m.begin())->second == 5.5);
s = m.erase(2);
assert(m.size() == 1);
assert(s == 1);
assert(m.begin()->first == 5);
assert(m.begin()->second == 5.5);
s = m.erase(5);
assert(m.size() == 0);
assert(s == 1);
}
#if __cplusplus >= 201103L
{
typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef std::pair<int, double> P;
typedef M::size_type R;
P ar[] =
{
P(1, 1.5),
P(2, 2.5),
P(3, 3.5),
P(4, 4.5),
P(5, 5.5),
P(6, 6.5),
P(7, 7.5),
P(8, 8.5),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 8);
R s = m.erase(9);
assert(s == 0);
assert(m.size() == 8);
assert(m.begin()->first == 1);
assert(m.begin()->second == 1.5);
assert(next(m.begin())->first == 2);
assert(next(m.begin())->second == 2.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 3.5);
assert(next(m.begin(), 3)->first == 4);
assert(next(m.begin(), 3)->second == 4.5);
assert(next(m.begin(), 4)->first == 5);
assert(next(m.begin(), 4)->second == 5.5);
assert(next(m.begin(), 5)->first == 6);
assert(next(m.begin(), 5)->second == 6.5);
assert(next(m.begin(), 6)->first == 7);
assert(next(m.begin(), 6)->second == 7.5);
assert(next(m.begin(), 7)->first == 8);
assert(next(m.begin(), 7)->second == 8.5);
s = m.erase(4);
assert(m.size() == 7);
assert(s == 1);
assert(m.begin()->first == 1);
assert(m.begin()->second == 1.5);
assert(next(m.begin())->first == 2);
assert(next(m.begin())->second == 2.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 3.5);
assert(next(m.begin(), 3)->first == 5);
assert(next(m.begin(), 3)->second == 5.5);
assert(next(m.begin(), 4)->first == 6);
assert(next(m.begin(), 4)->second == 6.5);
assert(next(m.begin(), 5)->first == 7);
assert(next(m.begin(), 5)->second == 7.5);
assert(next(m.begin(), 6)->first == 8);
assert(next(m.begin(), 6)->second == 8.5);
s = m.erase(1);
assert(m.size() == 6);
assert(s == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 3);
assert(next(m.begin())->second == 3.5);
assert(next(m.begin(), 2)->first == 5);
assert(next(m.begin(), 2)->second == 5.5);
assert(next(m.begin(), 3)->first == 6);
assert(next(m.begin(), 3)->second == 6.5);
assert(next(m.begin(), 4)->first == 7);
assert(next(m.begin(), 4)->second == 7.5);
assert(next(m.begin(), 5)->first == 8);
assert(next(m.begin(), 5)->second == 8.5);
s = m.erase(8);
assert(m.size() == 5);
assert(s == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 3);
assert(next(m.begin())->second == 3.5);
assert(next(m.begin(), 2)->first == 5);
assert(next(m.begin(), 2)->second == 5.5);
assert(next(m.begin(), 3)->first == 6);
assert(next(m.begin(), 3)->second == 6.5);
assert(next(m.begin(), 4)->first == 7);
assert(next(m.begin(), 4)->second == 7.5);
s = m.erase(3);
assert(m.size() == 4);
assert(s == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 5);
assert(next(m.begin())->second == 5.5);
assert(next(m.begin(), 2)->first == 6);
assert(next(m.begin(), 2)->second == 6.5);
assert(next(m.begin(), 3)->first == 7);
assert(next(m.begin(), 3)->second == 7.5);
s = m.erase(6);
assert(m.size() == 3);
assert(s == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 5);
assert(next(m.begin())->second == 5.5);
assert(next(m.begin(), 2)->first == 7);
assert(next(m.begin(), 2)->second == 7.5);
s = m.erase(7);
assert(m.size() == 2);
assert(s == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 2.5);
assert(next(m.begin())->first == 5);
assert(next(m.begin())->second == 5.5);
s = m.erase(2);
assert(m.size() == 1);
assert(s == 1);
assert(m.begin()->first == 5);
assert(m.begin()->second == 5.5);
s = m.erase(5);
assert(m.size() == 0);
assert(s == 1);
}
#endif
}

View File

@@ -0,0 +1,89 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// pair<iterator, bool> insert(const value_type& v);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::map<int, double> M;
typedef std::pair<M::iterator, bool> R;
M m;
R r = m.insert(M::value_type(2, 2.5));
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 1);
assert(r.first->first == 2);
assert(r.first->second == 2.5);
r = m.insert(M::value_type(1, 1.5));
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 2);
assert(r.first->first == 1);
assert(r.first->second == 1.5);
r = m.insert(M::value_type(3, 3.5));
assert(r.second);
assert(r.first == prev(m.end()));
assert(m.size() == 3);
assert(r.first->first == 3);
assert(r.first->second == 3.5);
r = m.insert(M::value_type(3, 3.5));
assert(!r.second);
assert(r.first == prev(m.end()));
assert(m.size() == 3);
assert(r.first->first == 3);
assert(r.first->second == 3.5);
}
#if __cplusplus >= 201103L
{
typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef std::pair<M::iterator, bool> R;
M m;
R r = m.insert(M::value_type(2, 2.5));
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 1);
assert(r.first->first == 2);
assert(r.first->second == 2.5);
r = m.insert(M::value_type(1, 1.5));
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 2);
assert(r.first->first == 1);
assert(r.first->second == 1.5);
r = m.insert(M::value_type(3, 3.5));
assert(r.second);
assert(r.first == prev(m.end()));
assert(m.size() == 3);
assert(r.first->first == 3);
assert(r.first->second == 3.5);
r = m.insert(M::value_type(3, 3.5));
assert(!r.second);
assert(r.first == prev(m.end()));
assert(m.size() == 3);
assert(r.first->first == 3);
assert(r.first->second == 3.5);
}
#endif
}

View File

@@ -0,0 +1,71 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// void insert(initializer_list<value_type> il);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
{
typedef std::pair<const int, double> V;
std::map<int, double> m =
{
{1, 1},
{1, 1.5},
{1, 2},
{3, 1},
{3, 1.5},
{3, 2}
};
m.insert({
{2, 1},
{2, 1.5},
{2, 2},
});
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
std::map<int, double, std::less<int>, min_allocator<V>> m =
{
{1, 1},
{1, 1.5},
{1, 2},
{3, 1},
{3, 1.5},
{3, 2}
};
m.insert({
{2, 1},
{2, 1.5},
{2, 2},
});
assert(m.size() == 3);
assert(distance(m.begin(), m.end()) == 3);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
}
#endif
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
}

View File

@@ -0,0 +1,81 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// iterator insert(const_iterator position, const value_type& v);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::map<int, double> M;
typedef M::iterator R;
M m;
R r = m.insert(m.end(), M::value_type(2, 2.5));
assert(r == m.begin());
assert(m.size() == 1);
assert(r->first == 2);
assert(r->second == 2.5);
r = m.insert(m.end(), M::value_type(1, 1.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(r->first == 1);
assert(r->second == 1.5);
r = m.insert(m.end(), M::value_type(3, 3.5));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3.5);
r = m.insert(m.end(), M::value_type(3, 3.5));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3.5);
}
#if __cplusplus >= 201103L
{
typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef M::iterator R;
M m;
R r = m.insert(m.end(), M::value_type(2, 2.5));
assert(r == m.begin());
assert(m.size() == 1);
assert(r->first == 2);
assert(r->second == 2.5);
r = m.insert(m.end(), M::value_type(1, 1.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(r->first == 1);
assert(r->second == 1.5);
r = m.insert(m.end(), M::value_type(3, 3.5));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3.5);
r = m.insert(m.end(), M::value_type(3, 3.5));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3.5);
}
#endif
}

View File

@@ -0,0 +1,77 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// template <class InputIterator>
// void insert(InputIterator first, InputIterator last);
#include <map>
#include <cassert>
#include "test_iterators.h"
#include "min_allocator.h"
int main()
{
{
typedef std::map<int, double> M;
typedef std::pair<int, double> P;
P ar[] =
{
P(1, 1),
P(1, 1.5),
P(1, 2),
P(2, 1),
P(2, 1.5),
P(2, 2),
P(3, 1),
P(3, 1.5),
P(3, 2),
};
M m;
m.insert(input_iterator<P*>(ar), input_iterator<P*>(ar + sizeof(ar)/sizeof(ar[0])));
assert(m.size() == 3);
assert(m.begin()->first == 1);
assert(m.begin()->second == 1);
assert(next(m.begin())->first == 2);
assert(next(m.begin())->second == 1);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 1);
}
#if __cplusplus >= 201103L
{
typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef std::pair<int, double> P;
P ar[] =
{
P(1, 1),
P(1, 1.5),
P(1, 2),
P(2, 1),
P(2, 1.5),
P(2, 2),
P(3, 1),
P(3, 1.5),
P(3, 2),
};
M m;
m.insert(input_iterator<P*>(ar), input_iterator<P*>(ar + sizeof(ar)/sizeof(ar[0])));
assert(m.size() == 3);
assert(m.begin()->first == 1);
assert(m.begin()->second == 1);
assert(next(m.begin())->first == 2);
assert(next(m.begin())->second == 1);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 1);
}
#endif
}

View File

@@ -0,0 +1,87 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// template <class P>
// iterator insert(const_iterator position, P&& p);
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
typedef std::map<int, MoveOnly> M;
typedef std::pair<int, MoveOnly> P;
typedef M::iterator R;
M m;
R r = m.insert(m.end(), P(2, 2));
assert(r == m.begin());
assert(m.size() == 1);
assert(r->first == 2);
assert(r->second == 2);
r = m.insert(m.end(), P(1, 1));
assert(r == m.begin());
assert(m.size() == 2);
assert(r->first == 1);
assert(r->second == 1);
r = m.insert(m.end(), P(3, 3));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3);
r = m.insert(m.end(), P(3, 3));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3);
}
#if __cplusplus >= 201103L
{
typedef std::map<int, MoveOnly, std::less<int>, min_allocator<std::pair<const int, MoveOnly>>> M;
typedef std::pair<int, MoveOnly> P;
typedef M::iterator R;
M m;
R r = m.insert(m.end(), P(2, 2));
assert(r == m.begin());
assert(m.size() == 1);
assert(r->first == 2);
assert(r->second == 2);
r = m.insert(m.end(), P(1, 1));
assert(r == m.begin());
assert(m.size() == 2);
assert(r->first == 1);
assert(r->second == 1);
r = m.insert(m.end(), P(3, 3));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3);
r = m.insert(m.end(), P(3, 3));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3);
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,93 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// template <class P>
// pair<iterator, bool> insert(P&& p);
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
typedef std::map<int, MoveOnly> M;
typedef std::pair<M::iterator, bool> R;
M m;
R r = m.insert(M::value_type(2, 2));
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 1);
assert(r.first->first == 2);
assert(r.first->second == 2);
r = m.insert(M::value_type(1, 1));
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 2);
assert(r.first->first == 1);
assert(r.first->second == 1);
r = m.insert(M::value_type(3, 3));
assert(r.second);
assert(r.first == prev(m.end()));
assert(m.size() == 3);
assert(r.first->first == 3);
assert(r.first->second == 3);
r = m.insert(M::value_type(3, 3));
assert(!r.second);
assert(r.first == prev(m.end()));
assert(m.size() == 3);
assert(r.first->first == 3);
assert(r.first->second == 3);
}
#if __cplusplus >= 201103L
{
typedef std::map<int, MoveOnly, std::less<int>, min_allocator<std::pair<const int, MoveOnly>>> M;
typedef std::pair<M::iterator, bool> R;
M m;
R r = m.insert(M::value_type(2, 2));
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 1);
assert(r.first->first == 2);
assert(r.first->second == 2);
r = m.insert(M::value_type(1, 1));
assert(r.second);
assert(r.first == m.begin());
assert(m.size() == 2);
assert(r.first->first == 1);
assert(r.first->second == 1);
r = m.insert(M::value_type(3, 3));
assert(r.second);
assert(r.first == prev(m.end()));
assert(m.size() == 3);
assert(r.first->first == 3);
assert(r.first->second == 3);
r = m.insert(M::value_type(3, 3));
assert(!r.second);
assert(r.first == prev(m.end()));
assert(m.size() == 3);
assert(r.first->first == 3);
assert(r.first->second == 3);
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,173 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// size_type count(const key_type& k) const;
#include <map>
#include <cassert>
#include "min_allocator.h"
#include "private_constructor.hpp"
int main()
{
{
typedef std::pair<const int, double> V;
typedef std::map<int, double> M;
{
typedef M::size_type R;
V ar[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.count(5);
assert(r == 1);
r = m.count(6);
assert(r == 1);
r = m.count(7);
assert(r == 1);
r = m.count(8);
assert(r == 1);
r = m.count(9);
assert(r == 1);
r = m.count(10);
assert(r == 1);
r = m.count(11);
assert(r == 1);
r = m.count(12);
assert(r == 1);
r = m.count(4);
assert(r == 0);
}
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
typedef std::map<int, double, std::less<int>, min_allocator<V>> M;
{
typedef M::size_type R;
V ar[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.count(5);
assert(r == 1);
r = m.count(6);
assert(r == 1);
r = m.count(7);
assert(r == 1);
r = m.count(8);
assert(r == 1);
r = m.count(9);
assert(r == 1);
r = m.count(10);
assert(r == 1);
r = m.count(11);
assert(r == 1);
r = m.count(12);
assert(r == 1);
r = m.count(4);
assert(r == 0);
}
}
#endif
#if _LIBCPP_STD_VER > 11
{
typedef std::pair<const int, double> V;
typedef std::map<int, double, std::less <>> M;
typedef M::size_type R;
V ar[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.count(5);
assert(r == 1);
r = m.count(6);
assert(r == 1);
r = m.count(7);
assert(r == 1);
r = m.count(8);
assert(r == 1);
r = m.count(9);
assert(r == 1);
r = m.count(10);
assert(r == 1);
r = m.count(11);
assert(r == 1);
r = m.count(12);
assert(r == 1);
r = m.count(4);
assert(r == 0);
}
{
typedef PrivateConstructor PC;
typedef std::map<PC, double, std::less<>> M;
typedef M::size_type R;
M m;
m [ PC::make(5) ] = 5;
m [ PC::make(6) ] = 6;
m [ PC::make(7) ] = 7;
m [ PC::make(8) ] = 8;
m [ PC::make(9) ] = 9;
m [ PC::make(10) ] = 10;
m [ PC::make(11) ] = 11;
m [ PC::make(12) ] = 12;
R r = m.count(5);
assert(r == 1);
r = m.count(6);
assert(r == 1);
r = m.count(7);
assert(r == 1);
r = m.count(8);
assert(r == 1);
r = m.count(9);
assert(r == 1);
r = m.count(10);
assert(r == 1);
r = m.count(11);
assert(r == 1);
r = m.count(12);
assert(r == 1);
r = m.count(4);
assert(r == 0);
}
#endif
}

View File

@@ -0,0 +1,437 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// pair<iterator,iterator> equal_range(const key_type& k);
// pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
#include <map>
#include <cassert>
#include "min_allocator.h"
#include "private_constructor.hpp"
int main()
{
{
typedef std::pair<const int, double> V;
typedef std::map<int, double> M;
{
typedef std::pair<M::iterator, M::iterator> R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.equal_range(5);
assert(r.first == next(m.begin(), 0));
assert(r.second == next(m.begin(), 1));
r = m.equal_range(7);
assert(r.first == next(m.begin(), 1));
assert(r.second == next(m.begin(), 2));
r = m.equal_range(9);
assert(r.first == next(m.begin(), 2));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(11);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 4));
r = m.equal_range(13);
assert(r.first == next(m.begin(), 4));
assert(r.second == next(m.begin(), 5));
r = m.equal_range(15);
assert(r.first == next(m.begin(), 5));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(17);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 7));
r = m.equal_range(19);
assert(r.first == next(m.begin(), 7));
assert(r.second == next(m.begin(), 8));
r = m.equal_range(4);
assert(r.first == next(m.begin(), 0));
assert(r.second == next(m.begin(), 0));
r = m.equal_range(6);
assert(r.first == next(m.begin(), 1));
assert(r.second == next(m.begin(), 1));
r = m.equal_range(8);
assert(r.first == next(m.begin(), 2));
assert(r.second == next(m.begin(), 2));
r = m.equal_range(10);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(12);
assert(r.first == next(m.begin(), 4));
assert(r.second == next(m.begin(), 4));
r = m.equal_range(14);
assert(r.first == next(m.begin(), 5));
assert(r.second == next(m.begin(), 5));
r = m.equal_range(16);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(18);
assert(r.first == next(m.begin(), 7));
assert(r.second == next(m.begin(), 7));
r = m.equal_range(20);
assert(r.first == next(m.begin(), 8));
assert(r.second == next(m.begin(), 8));
}
{
typedef std::pair<M::const_iterator, M::const_iterator> R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.equal_range(5);
assert(r.first == next(m.begin(), 0));
assert(r.second == next(m.begin(), 1));
r = m.equal_range(7);
assert(r.first == next(m.begin(), 1));
assert(r.second == next(m.begin(), 2));
r = m.equal_range(9);
assert(r.first == next(m.begin(), 2));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(11);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 4));
r = m.equal_range(13);
assert(r.first == next(m.begin(), 4));
assert(r.second == next(m.begin(), 5));
r = m.equal_range(15);
assert(r.first == next(m.begin(), 5));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(17);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 7));
r = m.equal_range(19);
assert(r.first == next(m.begin(), 7));
assert(r.second == next(m.begin(), 8));
r = m.equal_range(4);
assert(r.first == next(m.begin(), 0));
assert(r.second == next(m.begin(), 0));
r = m.equal_range(6);
assert(r.first == next(m.begin(), 1));
assert(r.second == next(m.begin(), 1));
r = m.equal_range(8);
assert(r.first == next(m.begin(), 2));
assert(r.second == next(m.begin(), 2));
r = m.equal_range(10);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(12);
assert(r.first == next(m.begin(), 4));
assert(r.second == next(m.begin(), 4));
r = m.equal_range(14);
assert(r.first == next(m.begin(), 5));
assert(r.second == next(m.begin(), 5));
r = m.equal_range(16);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(18);
assert(r.first == next(m.begin(), 7));
assert(r.second == next(m.begin(), 7));
r = m.equal_range(20);
assert(r.first == next(m.begin(), 8));
assert(r.second == next(m.begin(), 8));
}
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
typedef std::map<int, double, std::less<int>, min_allocator<V>> M;
{
typedef std::pair<M::iterator, M::iterator> R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.equal_range(5);
assert(r.first == next(m.begin(), 0));
assert(r.second == next(m.begin(), 1));
r = m.equal_range(7);
assert(r.first == next(m.begin(), 1));
assert(r.second == next(m.begin(), 2));
r = m.equal_range(9);
assert(r.first == next(m.begin(), 2));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(11);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 4));
r = m.equal_range(13);
assert(r.first == next(m.begin(), 4));
assert(r.second == next(m.begin(), 5));
r = m.equal_range(15);
assert(r.first == next(m.begin(), 5));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(17);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 7));
r = m.equal_range(19);
assert(r.first == next(m.begin(), 7));
assert(r.second == next(m.begin(), 8));
r = m.equal_range(4);
assert(r.first == next(m.begin(), 0));
assert(r.second == next(m.begin(), 0));
r = m.equal_range(6);
assert(r.first == next(m.begin(), 1));
assert(r.second == next(m.begin(), 1));
r = m.equal_range(8);
assert(r.first == next(m.begin(), 2));
assert(r.second == next(m.begin(), 2));
r = m.equal_range(10);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(12);
assert(r.first == next(m.begin(), 4));
assert(r.second == next(m.begin(), 4));
r = m.equal_range(14);
assert(r.first == next(m.begin(), 5));
assert(r.second == next(m.begin(), 5));
r = m.equal_range(16);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(18);
assert(r.first == next(m.begin(), 7));
assert(r.second == next(m.begin(), 7));
r = m.equal_range(20);
assert(r.first == next(m.begin(), 8));
assert(r.second == next(m.begin(), 8));
}
{
typedef std::pair<M::const_iterator, M::const_iterator> R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.equal_range(5);
assert(r.first == next(m.begin(), 0));
assert(r.second == next(m.begin(), 1));
r = m.equal_range(7);
assert(r.first == next(m.begin(), 1));
assert(r.second == next(m.begin(), 2));
r = m.equal_range(9);
assert(r.first == next(m.begin(), 2));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(11);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 4));
r = m.equal_range(13);
assert(r.first == next(m.begin(), 4));
assert(r.second == next(m.begin(), 5));
r = m.equal_range(15);
assert(r.first == next(m.begin(), 5));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(17);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 7));
r = m.equal_range(19);
assert(r.first == next(m.begin(), 7));
assert(r.second == next(m.begin(), 8));
r = m.equal_range(4);
assert(r.first == next(m.begin(), 0));
assert(r.second == next(m.begin(), 0));
r = m.equal_range(6);
assert(r.first == next(m.begin(), 1));
assert(r.second == next(m.begin(), 1));
r = m.equal_range(8);
assert(r.first == next(m.begin(), 2));
assert(r.second == next(m.begin(), 2));
r = m.equal_range(10);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(12);
assert(r.first == next(m.begin(), 4));
assert(r.second == next(m.begin(), 4));
r = m.equal_range(14);
assert(r.first == next(m.begin(), 5));
assert(r.second == next(m.begin(), 5));
r = m.equal_range(16);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(18);
assert(r.first == next(m.begin(), 7));
assert(r.second == next(m.begin(), 7));
r = m.equal_range(20);
assert(r.first == next(m.begin(), 8));
assert(r.second == next(m.begin(), 8));
}
}
#endif
#if _LIBCPP_STD_VER > 11
{
typedef std::pair<const int, double> V;
typedef std::map<int, double, std::less<>> M;
typedef std::pair<M::iterator, M::iterator> R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.equal_range(5);
assert(r.first == next(m.begin(), 0));
assert(r.second == next(m.begin(), 1));
r = m.equal_range(7);
assert(r.first == next(m.begin(), 1));
assert(r.second == next(m.begin(), 2));
r = m.equal_range(9);
assert(r.first == next(m.begin(), 2));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(11);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 4));
r = m.equal_range(13);
assert(r.first == next(m.begin(), 4));
assert(r.second == next(m.begin(), 5));
r = m.equal_range(15);
assert(r.first == next(m.begin(), 5));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(17);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 7));
r = m.equal_range(19);
assert(r.first == next(m.begin(), 7));
assert(r.second == next(m.begin(), 8));
r = m.equal_range(4);
assert(r.first == next(m.begin(), 0));
assert(r.second == next(m.begin(), 0));
r = m.equal_range(6);
assert(r.first == next(m.begin(), 1));
assert(r.second == next(m.begin(), 1));
r = m.equal_range(8);
assert(r.first == next(m.begin(), 2));
assert(r.second == next(m.begin(), 2));
r = m.equal_range(10);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(12);
assert(r.first == next(m.begin(), 4));
assert(r.second == next(m.begin(), 4));
r = m.equal_range(14);
assert(r.first == next(m.begin(), 5));
assert(r.second == next(m.begin(), 5));
r = m.equal_range(16);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(18);
assert(r.first == next(m.begin(), 7));
assert(r.second == next(m.begin(), 7));
r = m.equal_range(20);
assert(r.first == next(m.begin(), 8));
assert(r.second == next(m.begin(), 8));
}
{
typedef PrivateConstructor PC;
typedef std::map<PC, double, std::less<>> M;
typedef std::pair<M::iterator, M::iterator> R;
M m;
m [ PC::make(5) ] = 5;
m [ PC::make(7) ] = 6;
m [ PC::make(9) ] = 7;
m [ PC::make(11) ] = 8;
m [ PC::make(13) ] = 9;
m [ PC::make(15) ] = 10;
m [ PC::make(17) ] = 11;
m [ PC::make(19) ] = 12;
R r = m.equal_range(5);
assert(r.first == next(m.begin(), 0));
assert(r.second == next(m.begin(), 1));
r = m.equal_range(7);
assert(r.first == next(m.begin(), 1));
assert(r.second == next(m.begin(), 2));
r = m.equal_range(9);
assert(r.first == next(m.begin(), 2));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(11);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 4));
r = m.equal_range(13);
assert(r.first == next(m.begin(), 4));
assert(r.second == next(m.begin(), 5));
r = m.equal_range(15);
assert(r.first == next(m.begin(), 5));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(17);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 7));
r = m.equal_range(19);
assert(r.first == next(m.begin(), 7));
assert(r.second == next(m.begin(), 8));
r = m.equal_range(4);
assert(r.first == next(m.begin(), 0));
assert(r.second == next(m.begin(), 0));
r = m.equal_range(6);
assert(r.first == next(m.begin(), 1));
assert(r.second == next(m.begin(), 1));
r = m.equal_range(8);
assert(r.first == next(m.begin(), 2));
assert(r.second == next(m.begin(), 2));
r = m.equal_range(10);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(12);
assert(r.first == next(m.begin(), 4));
assert(r.second == next(m.begin(), 4));
r = m.equal_range(14);
assert(r.first == next(m.begin(), 5));
assert(r.second == next(m.begin(), 5));
r = m.equal_range(16);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(18);
assert(r.first == next(m.begin(), 7));
assert(r.second == next(m.begin(), 7));
r = m.equal_range(20);
assert(r.first == next(m.begin(), 8));
assert(r.second == next(m.begin(), 8));
}
#endif
}

View File

@@ -0,0 +1,240 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// iterator find(const key_type& k);
// const_iterator find(const key_type& k) const;
#include <map>
#include <cassert>
#include "min_allocator.h"
#include "private_constructor.hpp"
int main()
{
{
typedef std::pair<const int, double> V;
typedef std::map<int, double> M;
{
typedef M::iterator R;
V ar[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.find(5);
assert(r == m.begin());
r = m.find(6);
assert(r == next(m.begin()));
r = m.find(7);
assert(r == next(m.begin(), 2));
r = m.find(8);
assert(r == next(m.begin(), 3));
r = m.find(9);
assert(r == next(m.begin(), 4));
r = m.find(10);
assert(r == next(m.begin(), 5));
r = m.find(11);
assert(r == next(m.begin(), 6));
r = m.find(12);
assert(r == next(m.begin(), 7));
r = m.find(4);
assert(r == next(m.begin(), 8));
}
{
typedef M::const_iterator R;
V ar[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.find(5);
assert(r == m.begin());
r = m.find(6);
assert(r == next(m.begin()));
r = m.find(7);
assert(r == next(m.begin(), 2));
r = m.find(8);
assert(r == next(m.begin(), 3));
r = m.find(9);
assert(r == next(m.begin(), 4));
r = m.find(10);
assert(r == next(m.begin(), 5));
r = m.find(11);
assert(r == next(m.begin(), 6));
r = m.find(12);
assert(r == next(m.begin(), 7));
r = m.find(4);
assert(r == next(m.begin(), 8));
}
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
typedef std::map<int, double, std::less<int>, min_allocator<V>> M;
{
typedef M::iterator R;
V ar[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.find(5);
assert(r == m.begin());
r = m.find(6);
assert(r == next(m.begin()));
r = m.find(7);
assert(r == next(m.begin(), 2));
r = m.find(8);
assert(r == next(m.begin(), 3));
r = m.find(9);
assert(r == next(m.begin(), 4));
r = m.find(10);
assert(r == next(m.begin(), 5));
r = m.find(11);
assert(r == next(m.begin(), 6));
r = m.find(12);
assert(r == next(m.begin(), 7));
r = m.find(4);
assert(r == next(m.begin(), 8));
}
{
typedef M::const_iterator R;
V ar[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.find(5);
assert(r == m.begin());
r = m.find(6);
assert(r == next(m.begin()));
r = m.find(7);
assert(r == next(m.begin(), 2));
r = m.find(8);
assert(r == next(m.begin(), 3));
r = m.find(9);
assert(r == next(m.begin(), 4));
r = m.find(10);
assert(r == next(m.begin(), 5));
r = m.find(11);
assert(r == next(m.begin(), 6));
r = m.find(12);
assert(r == next(m.begin(), 7));
r = m.find(4);
assert(r == next(m.begin(), 8));
}
}
#endif
#if _LIBCPP_STD_VER > 11
{
typedef std::pair<const int, double> V;
typedef std::map<int, double, std::less<>> M;
typedef M::iterator R;
V ar[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.find(5);
assert(r == m.begin());
r = m.find(6);
assert(r == next(m.begin()));
r = m.find(7);
assert(r == next(m.begin(), 2));
r = m.find(8);
assert(r == next(m.begin(), 3));
r = m.find(9);
assert(r == next(m.begin(), 4));
r = m.find(10);
assert(r == next(m.begin(), 5));
r = m.find(11);
assert(r == next(m.begin(), 6));
r = m.find(12);
assert(r == next(m.begin(), 7));
r = m.find(4);
assert(r == next(m.begin(), 8));
}
{
typedef PrivateConstructor PC;
typedef std::map<PC, double, std::less<>> M;
typedef M::iterator R;
M m;
m [ PC::make(5) ] = 5;
m [ PC::make(6) ] = 6;
m [ PC::make(7) ] = 7;
m [ PC::make(8) ] = 8;
m [ PC::make(9) ] = 9;
m [ PC::make(10) ] = 10;
m [ PC::make(11) ] = 11;
m [ PC::make(12) ] = 12;
R r = m.find(5);
assert(r == m.begin());
r = m.find(6);
assert(r == next(m.begin()));
r = m.find(7);
assert(r == next(m.begin(), 2));
r = m.find(8);
assert(r == next(m.begin(), 3));
r = m.find(9);
assert(r == next(m.begin(), 4));
r = m.find(10);
assert(r == next(m.begin(), 5));
r = m.find(11);
assert(r == next(m.begin(), 6));
r = m.find(12);
assert(r == next(m.begin(), 7));
r = m.find(4);
assert(r == next(m.begin(), 8));
}
#endif
}

View File

@@ -0,0 +1,336 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// iterator lower_bound(const key_type& k);
// const_iterator lower_bound(const key_type& k) const;
#include <map>
#include <cassert>
#include "min_allocator.h"
#include "private_constructor.hpp"
int main()
{
{
typedef std::pair<const int, double> V;
typedef std::map<int, double> M;
{
typedef M::iterator R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.lower_bound(5);
assert(r == m.begin());
r = m.lower_bound(7);
assert(r == next(m.begin()));
r = m.lower_bound(9);
assert(r == next(m.begin(), 2));
r = m.lower_bound(11);
assert(r == next(m.begin(), 3));
r = m.lower_bound(13);
assert(r == next(m.begin(), 4));
r = m.lower_bound(15);
assert(r == next(m.begin(), 5));
r = m.lower_bound(17);
assert(r == next(m.begin(), 6));
r = m.lower_bound(19);
assert(r == next(m.begin(), 7));
r = m.lower_bound(4);
assert(r == next(m.begin(), 0));
r = m.lower_bound(6);
assert(r == next(m.begin(), 1));
r = m.lower_bound(8);
assert(r == next(m.begin(), 2));
r = m.lower_bound(10);
assert(r == next(m.begin(), 3));
r = m.lower_bound(12);
assert(r == next(m.begin(), 4));
r = m.lower_bound(14);
assert(r == next(m.begin(), 5));
r = m.lower_bound(16);
assert(r == next(m.begin(), 6));
r = m.lower_bound(18);
assert(r == next(m.begin(), 7));
r = m.lower_bound(20);
assert(r == next(m.begin(), 8));
}
{
typedef M::const_iterator R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.lower_bound(5);
assert(r == m.begin());
r = m.lower_bound(7);
assert(r == next(m.begin()));
r = m.lower_bound(9);
assert(r == next(m.begin(), 2));
r = m.lower_bound(11);
assert(r == next(m.begin(), 3));
r = m.lower_bound(13);
assert(r == next(m.begin(), 4));
r = m.lower_bound(15);
assert(r == next(m.begin(), 5));
r = m.lower_bound(17);
assert(r == next(m.begin(), 6));
r = m.lower_bound(19);
assert(r == next(m.begin(), 7));
r = m.lower_bound(4);
assert(r == next(m.begin(), 0));
r = m.lower_bound(6);
assert(r == next(m.begin(), 1));
r = m.lower_bound(8);
assert(r == next(m.begin(), 2));
r = m.lower_bound(10);
assert(r == next(m.begin(), 3));
r = m.lower_bound(12);
assert(r == next(m.begin(), 4));
r = m.lower_bound(14);
assert(r == next(m.begin(), 5));
r = m.lower_bound(16);
assert(r == next(m.begin(), 6));
r = m.lower_bound(18);
assert(r == next(m.begin(), 7));
r = m.lower_bound(20);
assert(r == next(m.begin(), 8));
}
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
typedef std::map<int, double, std::less<int>, min_allocator<V>> M;
{
typedef M::iterator R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.lower_bound(5);
assert(r == m.begin());
r = m.lower_bound(7);
assert(r == next(m.begin()));
r = m.lower_bound(9);
assert(r == next(m.begin(), 2));
r = m.lower_bound(11);
assert(r == next(m.begin(), 3));
r = m.lower_bound(13);
assert(r == next(m.begin(), 4));
r = m.lower_bound(15);
assert(r == next(m.begin(), 5));
r = m.lower_bound(17);
assert(r == next(m.begin(), 6));
r = m.lower_bound(19);
assert(r == next(m.begin(), 7));
r = m.lower_bound(4);
assert(r == next(m.begin(), 0));
r = m.lower_bound(6);
assert(r == next(m.begin(), 1));
r = m.lower_bound(8);
assert(r == next(m.begin(), 2));
r = m.lower_bound(10);
assert(r == next(m.begin(), 3));
r = m.lower_bound(12);
assert(r == next(m.begin(), 4));
r = m.lower_bound(14);
assert(r == next(m.begin(), 5));
r = m.lower_bound(16);
assert(r == next(m.begin(), 6));
r = m.lower_bound(18);
assert(r == next(m.begin(), 7));
r = m.lower_bound(20);
assert(r == next(m.begin(), 8));
}
{
typedef M::const_iterator R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.lower_bound(5);
assert(r == m.begin());
r = m.lower_bound(7);
assert(r == next(m.begin()));
r = m.lower_bound(9);
assert(r == next(m.begin(), 2));
r = m.lower_bound(11);
assert(r == next(m.begin(), 3));
r = m.lower_bound(13);
assert(r == next(m.begin(), 4));
r = m.lower_bound(15);
assert(r == next(m.begin(), 5));
r = m.lower_bound(17);
assert(r == next(m.begin(), 6));
r = m.lower_bound(19);
assert(r == next(m.begin(), 7));
r = m.lower_bound(4);
assert(r == next(m.begin(), 0));
r = m.lower_bound(6);
assert(r == next(m.begin(), 1));
r = m.lower_bound(8);
assert(r == next(m.begin(), 2));
r = m.lower_bound(10);
assert(r == next(m.begin(), 3));
r = m.lower_bound(12);
assert(r == next(m.begin(), 4));
r = m.lower_bound(14);
assert(r == next(m.begin(), 5));
r = m.lower_bound(16);
assert(r == next(m.begin(), 6));
r = m.lower_bound(18);
assert(r == next(m.begin(), 7));
r = m.lower_bound(20);
assert(r == next(m.begin(), 8));
}
}
#endif
#if _LIBCPP_STD_VER > 11
{
typedef std::pair<const int, double> V;
typedef std::map<int, double, std::less <>> M;
typedef M::iterator R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.lower_bound(5);
assert(r == m.begin());
r = m.lower_bound(7);
assert(r == next(m.begin()));
r = m.lower_bound(9);
assert(r == next(m.begin(), 2));
r = m.lower_bound(11);
assert(r == next(m.begin(), 3));
r = m.lower_bound(13);
assert(r == next(m.begin(), 4));
r = m.lower_bound(15);
assert(r == next(m.begin(), 5));
r = m.lower_bound(17);
assert(r == next(m.begin(), 6));
r = m.lower_bound(19);
assert(r == next(m.begin(), 7));
r = m.lower_bound(4);
assert(r == next(m.begin(), 0));
r = m.lower_bound(6);
assert(r == next(m.begin(), 1));
r = m.lower_bound(8);
assert(r == next(m.begin(), 2));
r = m.lower_bound(10);
assert(r == next(m.begin(), 3));
r = m.lower_bound(12);
assert(r == next(m.begin(), 4));
r = m.lower_bound(14);
assert(r == next(m.begin(), 5));
r = m.lower_bound(16);
assert(r == next(m.begin(), 6));
r = m.lower_bound(18);
assert(r == next(m.begin(), 7));
r = m.lower_bound(20);
assert(r == next(m.begin(), 8));
}
{
typedef PrivateConstructor PC;
typedef std::map<PC, double, std::less<>> M;
typedef M::iterator R;
M m;
m [ PC::make(5) ] = 5;
m [ PC::make(7) ] = 6;
m [ PC::make(9) ] = 7;
m [ PC::make(11) ] = 8;
m [ PC::make(13) ] = 9;
m [ PC::make(15) ] = 10;
m [ PC::make(17) ] = 11;
m [ PC::make(19) ] = 12;
R r = m.lower_bound(5);
assert(r == m.begin());
r = m.lower_bound(7);
assert(r == next(m.begin()));
r = m.lower_bound(9);
assert(r == next(m.begin(), 2));
r = m.lower_bound(11);
assert(r == next(m.begin(), 3));
r = m.lower_bound(13);
assert(r == next(m.begin(), 4));
r = m.lower_bound(15);
assert(r == next(m.begin(), 5));
r = m.lower_bound(17);
assert(r == next(m.begin(), 6));
r = m.lower_bound(19);
assert(r == next(m.begin(), 7));
r = m.lower_bound(4);
assert(r == next(m.begin(), 0));
r = m.lower_bound(6);
assert(r == next(m.begin(), 1));
r = m.lower_bound(8);
assert(r == next(m.begin(), 2));
r = m.lower_bound(10);
assert(r == next(m.begin(), 3));
r = m.lower_bound(12);
assert(r == next(m.begin(), 4));
r = m.lower_bound(14);
assert(r == next(m.begin(), 5));
r = m.lower_bound(16);
assert(r == next(m.begin(), 6));
r = m.lower_bound(18);
assert(r == next(m.begin(), 7));
r = m.lower_bound(20);
assert(r == next(m.begin(), 8));
}
#endif
}

View File

@@ -0,0 +1,335 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// iterator upper_bound(const key_type& k);
// const_iterator upper_bound(const key_type& k) const;
#include <map>
#include <cassert>
#include "min_allocator.h"
#include "private_constructor.hpp"
int main()
{
{
typedef std::pair<const int, double> V;
typedef std::map<int, double> M;
{
typedef M::iterator R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.upper_bound(5);
assert(r == next(m.begin(), 1));
r = m.upper_bound(7);
assert(r == next(m.begin(), 2));
r = m.upper_bound(9);
assert(r == next(m.begin(), 3));
r = m.upper_bound(11);
assert(r == next(m.begin(), 4));
r = m.upper_bound(13);
assert(r == next(m.begin(), 5));
r = m.upper_bound(15);
assert(r == next(m.begin(), 6));
r = m.upper_bound(17);
assert(r == next(m.begin(), 7));
r = m.upper_bound(19);
assert(r == next(m.begin(), 8));
r = m.upper_bound(4);
assert(r == next(m.begin(), 0));
r = m.upper_bound(6);
assert(r == next(m.begin(), 1));
r = m.upper_bound(8);
assert(r == next(m.begin(), 2));
r = m.upper_bound(10);
assert(r == next(m.begin(), 3));
r = m.upper_bound(12);
assert(r == next(m.begin(), 4));
r = m.upper_bound(14);
assert(r == next(m.begin(), 5));
r = m.upper_bound(16);
assert(r == next(m.begin(), 6));
r = m.upper_bound(18);
assert(r == next(m.begin(), 7));
r = m.upper_bound(20);
assert(r == next(m.begin(), 8));
}
{
typedef M::const_iterator R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.upper_bound(5);
assert(r == next(m.begin(), 1));
r = m.upper_bound(7);
assert(r == next(m.begin(), 2));
r = m.upper_bound(9);
assert(r == next(m.begin(), 3));
r = m.upper_bound(11);
assert(r == next(m.begin(), 4));
r = m.upper_bound(13);
assert(r == next(m.begin(), 5));
r = m.upper_bound(15);
assert(r == next(m.begin(), 6));
r = m.upper_bound(17);
assert(r == next(m.begin(), 7));
r = m.upper_bound(19);
assert(r == next(m.begin(), 8));
r = m.upper_bound(4);
assert(r == next(m.begin(), 0));
r = m.upper_bound(6);
assert(r == next(m.begin(), 1));
r = m.upper_bound(8);
assert(r == next(m.begin(), 2));
r = m.upper_bound(10);
assert(r == next(m.begin(), 3));
r = m.upper_bound(12);
assert(r == next(m.begin(), 4));
r = m.upper_bound(14);
assert(r == next(m.begin(), 5));
r = m.upper_bound(16);
assert(r == next(m.begin(), 6));
r = m.upper_bound(18);
assert(r == next(m.begin(), 7));
r = m.upper_bound(20);
assert(r == next(m.begin(), 8));
}
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
typedef std::map<int, double, std::less<int>, min_allocator<V>> M;
{
typedef M::iterator R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.upper_bound(5);
assert(r == next(m.begin(), 1));
r = m.upper_bound(7);
assert(r == next(m.begin(), 2));
r = m.upper_bound(9);
assert(r == next(m.begin(), 3));
r = m.upper_bound(11);
assert(r == next(m.begin(), 4));
r = m.upper_bound(13);
assert(r == next(m.begin(), 5));
r = m.upper_bound(15);
assert(r == next(m.begin(), 6));
r = m.upper_bound(17);
assert(r == next(m.begin(), 7));
r = m.upper_bound(19);
assert(r == next(m.begin(), 8));
r = m.upper_bound(4);
assert(r == next(m.begin(), 0));
r = m.upper_bound(6);
assert(r == next(m.begin(), 1));
r = m.upper_bound(8);
assert(r == next(m.begin(), 2));
r = m.upper_bound(10);
assert(r == next(m.begin(), 3));
r = m.upper_bound(12);
assert(r == next(m.begin(), 4));
r = m.upper_bound(14);
assert(r == next(m.begin(), 5));
r = m.upper_bound(16);
assert(r == next(m.begin(), 6));
r = m.upper_bound(18);
assert(r == next(m.begin(), 7));
r = m.upper_bound(20);
assert(r == next(m.begin(), 8));
}
{
typedef M::const_iterator R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.upper_bound(5);
assert(r == next(m.begin(), 1));
r = m.upper_bound(7);
assert(r == next(m.begin(), 2));
r = m.upper_bound(9);
assert(r == next(m.begin(), 3));
r = m.upper_bound(11);
assert(r == next(m.begin(), 4));
r = m.upper_bound(13);
assert(r == next(m.begin(), 5));
r = m.upper_bound(15);
assert(r == next(m.begin(), 6));
r = m.upper_bound(17);
assert(r == next(m.begin(), 7));
r = m.upper_bound(19);
assert(r == next(m.begin(), 8));
r = m.upper_bound(4);
assert(r == next(m.begin(), 0));
r = m.upper_bound(6);
assert(r == next(m.begin(), 1));
r = m.upper_bound(8);
assert(r == next(m.begin(), 2));
r = m.upper_bound(10);
assert(r == next(m.begin(), 3));
r = m.upper_bound(12);
assert(r == next(m.begin(), 4));
r = m.upper_bound(14);
assert(r == next(m.begin(), 5));
r = m.upper_bound(16);
assert(r == next(m.begin(), 6));
r = m.upper_bound(18);
assert(r == next(m.begin(), 7));
r = m.upper_bound(20);
assert(r == next(m.begin(), 8));
}
}
#endif
#if _LIBCPP_STD_VER > 11
{
typedef std::pair<const int, double> V;
typedef std::map<int, double, std::less<>> M;
typedef M::iterator R;
V ar[] =
{
V(5, 5),
V(7, 6),
V(9, 7),
V(11, 8),
V(13, 9),
V(15, 10),
V(17, 11),
V(19, 12)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.upper_bound(5);
assert(r == next(m.begin(), 1));
r = m.upper_bound(7);
assert(r == next(m.begin(), 2));
r = m.upper_bound(9);
assert(r == next(m.begin(), 3));
r = m.upper_bound(11);
assert(r == next(m.begin(), 4));
r = m.upper_bound(13);
assert(r == next(m.begin(), 5));
r = m.upper_bound(15);
assert(r == next(m.begin(), 6));
r = m.upper_bound(17);
assert(r == next(m.begin(), 7));
r = m.upper_bound(19);
assert(r == next(m.begin(), 8));
r = m.upper_bound(4);
assert(r == next(m.begin(), 0));
r = m.upper_bound(6);
assert(r == next(m.begin(), 1));
r = m.upper_bound(8);
assert(r == next(m.begin(), 2));
r = m.upper_bound(10);
assert(r == next(m.begin(), 3));
r = m.upper_bound(12);
assert(r == next(m.begin(), 4));
r = m.upper_bound(14);
assert(r == next(m.begin(), 5));
r = m.upper_bound(16);
assert(r == next(m.begin(), 6));
r = m.upper_bound(18);
assert(r == next(m.begin(), 7));
r = m.upper_bound(20);
assert(r == next(m.begin(), 8));
}
{
typedef PrivateConstructor PC;
typedef std::map<PC, double, std::less<>> M;
typedef M::iterator R;
M m;
m [ PC::make(5) ] = 5;
m [ PC::make(7) ] = 6;
m [ PC::make(9) ] = 7;
m [ PC::make(11) ] = 8;
m [ PC::make(13) ] = 9;
m [ PC::make(15) ] = 10;
m [ PC::make(17) ] = 11;
m [ PC::make(19) ] = 12;
R r = m.upper_bound(5);
assert(r == next(m.begin(), 1));
r = m.upper_bound(7);
assert(r == next(m.begin(), 2));
r = m.upper_bound(9);
assert(r == next(m.begin(), 3));
r = m.upper_bound(11);
assert(r == next(m.begin(), 4));
r = m.upper_bound(13);
assert(r == next(m.begin(), 5));
r = m.upper_bound(15);
assert(r == next(m.begin(), 6));
r = m.upper_bound(17);
assert(r == next(m.begin(), 7));
r = m.upper_bound(19);
assert(r == next(m.begin(), 8));
r = m.upper_bound(4);
assert(r == next(m.begin(), 0));
r = m.upper_bound(6);
assert(r == next(m.begin(), 1));
r = m.upper_bound(8);
assert(r == next(m.begin(), 2));
r = m.upper_bound(10);
assert(r == next(m.begin(), 3));
r = m.upper_bound(12);
assert(r == next(m.begin(), 4));
r = m.upper_bound(14);
assert(r == next(m.begin(), 5));
r = m.upper_bound(16);
assert(r == next(m.begin(), 6));
r = m.upper_bound(18);
assert(r == next(m.begin(), 7));
r = m.upper_bound(20);
assert(r == next(m.begin(), 8));
}
#endif
}

View File

@@ -0,0 +1,201 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// void swap(map& m);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
typedef std::map<int, double> M;
{
V ar1[] =
{
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
typedef std::map<int, double, std::less<int>, min_allocator<V>> M;
{
V ar1[] =
{
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
}
#endif
}

View File

@@ -0,0 +1,306 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class map
// template <class Key, class T, class Compare, class Allocator>
// void
// swap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y);
#include <map>
#include <cassert>
#include "test_allocator.h"
#include "../../../test_compare.h"
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
typedef std::map<int, double> M;
{
V ar1[] =
{
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
typedef test_allocator<V> A;
typedef test_compare<std::less<int> > C;
typedef std::map<int, double, C, A> M;
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]), C(1), A(1));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]), C(2), A(2));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
assert(m1.key_comp() == C(2));
assert(m1.get_allocator() == A(1));
assert(m2.key_comp() == C(1));
assert(m2.get_allocator() == A(2));
}
{
typedef other_allocator<V> A;
typedef test_compare<std::less<int> > C;
typedef std::map<int, double, C, A> M;
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]), C(1), A(1));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]), C(2), A(2));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
assert(m1.key_comp() == C(2));
assert(m1.get_allocator() == A(2));
assert(m2.key_comp() == C(1));
assert(m2.get_allocator() == A(1));
}
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
typedef std::map<int, double, std::less<int>, min_allocator<V>> M;
{
V ar1[] =
{
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
typedef min_allocator<V> A;
typedef test_compare<std::less<int> > C;
typedef std::map<int, double, C, A> M;
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]), C(1), A());
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]), C(2), A());
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
assert(m1.key_comp() == C(2));
assert(m1.get_allocator() == A());
assert(m2.key_comp() == C(1));
assert(m2.get_allocator() == A());
}
}
#endif
}

View File

@@ -0,0 +1,60 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// void swap(map& c)
// noexcept(!allocator_type::propagate_on_container_swap::value ||
// __is_nothrow_swappable<allocator_type>::value);
// This tests a conforming extension
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "test_allocator.h"
template <class T>
struct some_comp
{
typedef T value_type;
some_comp() {}
some_comp(const some_comp&) {}
void deallocate(void*, unsigned) {}
typedef std::true_type propagate_on_container_swap;
};
int main()
{
#if __has_feature(cxx_noexcept)
{
typedef std::map<MoveOnly, MoveOnly> C;
C c1, c2;
static_assert(noexcept(swap(c1, c2)), "");
}
{
typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C;
C c1, c2;
static_assert(noexcept(swap(c1, c2)), "");
}
{
typedef std::map<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C;
C c1, c2;
static_assert(noexcept(swap(c1, c2)), "");
}
{
typedef std::map<MoveOnly, MoveOnly, some_comp<MoveOnly>> C;
C c1, c2;
static_assert(!noexcept(swap(c1, c2)), "");
}
#endif
}

View File

@@ -0,0 +1,70 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// template <class Key, class T, class Compare = less<Key>,
// class Allocator = allocator<pair<const Key, T>>>
// class map
// {
// public:
// // types:
// typedef Key key_type;
// typedef T mapped_type;
// typedef pair<const key_type, mapped_type> value_type;
// typedef Compare key_compare;
// typedef Allocator allocator_type;
// typedef typename allocator_type::reference reference;
// typedef typename allocator_type::const_reference const_reference;
// typedef typename allocator_type::pointer pointer;
// typedef typename allocator_type::const_pointer const_pointer;
// typedef typename allocator_type::size_type size_type;
// typedef typename allocator_type::difference_type difference_type;
// ...
// };
#include <map>
#include <type_traits>
#include "min_allocator.h"
int main()
{
{
typedef std::map<int, double> C;
static_assert((std::is_same<C::key_type, int>::value), "");
static_assert((std::is_same<C::mapped_type, double>::value), "");
static_assert((std::is_same<C::value_type, std::pair<const int, double> >::value), "");
static_assert((std::is_same<C::key_compare, std::less<int> >::value), "");
static_assert((std::is_same<C::allocator_type, std::allocator<std::pair<const int, double> > >::value), "");
static_assert((std::is_same<C::reference, std::pair<const int, double>&>::value), "");
static_assert((std::is_same<C::const_reference, const std::pair<const int, double>&>::value), "");
static_assert((std::is_same<C::pointer, std::pair<const int, double>*>::value), "");
static_assert((std::is_same<C::const_pointer, const std::pair<const int, double>*>::value), "");
static_assert((std::is_same<C::size_type, std::size_t>::value), "");
static_assert((std::is_same<C::difference_type, std::ptrdiff_t>::value), "");
}
#if __cplusplus >= 201103L
{
typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> C;
static_assert((std::is_same<C::key_type, int>::value), "");
static_assert((std::is_same<C::mapped_type, double>::value), "");
static_assert((std::is_same<C::value_type, std::pair<const int, double> >::value), "");
static_assert((std::is_same<C::key_compare, std::less<int> >::value), "");
static_assert((std::is_same<C::allocator_type, min_allocator<std::pair<const int, double> > >::value), "");
static_assert((std::is_same<C::reference, std::pair<const int, double>&>::value), "");
static_assert((std::is_same<C::const_reference, const std::pair<const int, double>&>::value), "");
static_assert((std::is_same<C::pointer, min_pointer<std::pair<const int, double>>>::value), "");
static_assert((std::is_same<C::const_pointer, min_pointer<const std::pair<const int, double>>>::value), "");
// min_allocator doesn't have a size_type, so one gets synthesized
static_assert((std::is_same<C::size_type, std::make_unsigned<C::difference_type>::type>::value), "");
static_assert((std::is_same<C::difference_type, std::ptrdiff_t>::value), "");
}
#endif
}

View File

@@ -0,0 +1,20 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
#include <map>
#ifndef _LIBCPP_VERSION
#error _LIBCPP_VERSION not defined
#endif
int main()
{
}

View File

@@ -0,0 +1,43 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// bool empty() const;
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::multimap<int, double> M;
M m;
assert(m.empty());
m.insert(M::value_type(1, 1.5));
assert(!m.empty());
m.clear();
assert(m.empty());
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
M m;
assert(m.empty());
m.insert(M::value_type(1, 1.5));
assert(!m.empty());
m.clear();
assert(m.empty());
}
#endif
}

View File

@@ -0,0 +1,231 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// iterator begin();
// const_iterator begin() const;
// iterator end();
// const_iterator end() const;
//
// reverse_iterator rbegin();
// const_reverse_iterator rbegin() const;
// reverse_iterator rend();
// const_reverse_iterator rend() const;
//
// const_iterator cbegin() const;
// const_iterator cend() const;
// const_reverse_iterator crbegin() const;
// const_reverse_iterator crend() const;
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
V(4, 1),
V(4, 1.5),
V(4, 2),
V(5, 1),
V(5, 1.5),
V(5, 2),
V(6, 1),
V(6, 1.5),
V(6, 2),
V(7, 1),
V(7, 1.5),
V(7, 2),
V(8, 1),
V(8, 1.5),
V(8, 2)
};
std::multimap<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(std::distance(m.begin(), m.end()) == m.size());
assert(std::distance(m.rbegin(), m.rend()) == m.size());
std::multimap<int, double>::iterator i;
i = m.begin();
std::multimap<int, double>::const_iterator k = i;
assert(i == k);
for (int j = 1; j <= 8; ++j)
for (double d = 1; d <= 2; d += .5, ++i)
{
assert(i->first == j);
assert(i->second == d);
i->second = 2.5;
assert(i->second == 2.5);
}
}
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
V(4, 1),
V(4, 1.5),
V(4, 2),
V(5, 1),
V(5, 1.5),
V(5, 2),
V(6, 1),
V(6, 1.5),
V(6, 2),
V(7, 1),
V(7, 1.5),
V(7, 2),
V(8, 1),
V(8, 1.5),
V(8, 2)
};
const std::multimap<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(std::distance(m.begin(), m.end()) == m.size());
assert(std::distance(m.cbegin(), m.cend()) == m.size());
assert(std::distance(m.rbegin(), m.rend()) == m.size());
assert(std::distance(m.crbegin(), m.crend()) == m.size());
std::multimap<int, double>::const_iterator i;
i = m.begin();
for (int j = 1; j <= 8; ++j)
for (double d = 1; d <= 2; d += .5, ++i)
{
assert(i->first == j);
assert(i->second == d);
}
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
V(4, 1),
V(4, 1.5),
V(4, 2),
V(5, 1),
V(5, 1.5),
V(5, 2),
V(6, 1),
V(6, 1.5),
V(6, 2),
V(7, 1),
V(7, 1.5),
V(7, 2),
V(8, 1),
V(8, 1.5),
V(8, 2)
};
std::multimap<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(std::distance(m.begin(), m.end()) == m.size());
assert(std::distance(m.rbegin(), m.rend()) == m.size());
std::multimap<int, double, std::less<int>, min_allocator<V>>::iterator i;
i = m.begin();
std::multimap<int, double, std::less<int>, min_allocator<V>>::const_iterator k = i;
assert(i == k);
for (int j = 1; j <= 8; ++j)
for (double d = 1; d <= 2; d += .5, ++i)
{
assert(i->first == j);
assert(i->second == d);
i->second = 2.5;
assert(i->second == 2.5);
}
}
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
V(4, 1),
V(4, 1.5),
V(4, 2),
V(5, 1),
V(5, 1.5),
V(5, 2),
V(6, 1),
V(6, 1.5),
V(6, 2),
V(7, 1),
V(7, 1.5),
V(7, 2),
V(8, 1),
V(8, 1.5),
V(8, 2)
};
const std::multimap<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(std::distance(m.begin(), m.end()) == m.size());
assert(std::distance(m.cbegin(), m.cend()) == m.size());
assert(std::distance(m.rbegin(), m.rend()) == m.size());
assert(std::distance(m.crbegin(), m.crend()) == m.size());
std::multimap<int, double, std::less<int>, min_allocator<V>>::const_iterator i;
i = m.begin();
for (int j = 1; j <= 8; ++j)
for (double d = 1; d <= 2; d += .5, ++i)
{
assert(i->first == j);
assert(i->second == d);
}
}
#endif
#if _LIBCPP_STD_VER > 11
{ // N3644 testing
typedef std::multimap<int, double> C;
C::iterator ii1{}, ii2{};
C::iterator ii4 = ii1;
C::const_iterator cii{};
assert ( ii1 == ii2 );
assert ( ii1 == ii4 );
assert (!(ii1 != ii2 ));
assert ( (ii1 == cii ));
assert ( (cii == ii1 ));
assert (!(ii1 != cii ));
assert (!(cii != ii1 ));
}
#endif
}

View File

@@ -0,0 +1,35 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// size_type max_size() const;
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::multimap<int, double> M;
M m;
assert(m.max_size() != 0);
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
M m;
assert(m.max_size() != 0);
}
#endif
}

View File

@@ -0,0 +1,42 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// explicit multimap(const allocator_type& a);
#include <map>
#include <cassert>
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
{
typedef std::less<int> C;
typedef test_allocator<std::pair<const int, double> > A;
std::multimap<int, double, C, A> m(A(5));
assert(m.empty());
assert(m.begin() == m.end());
assert(m.get_allocator() == A(5));
}
#if __cplusplus >= 201103L
{
typedef std::less<int> C;
typedef min_allocator<std::pair<const int, double> > A;
std::multimap<int, double, C, A> m(A{});
assert(m.empty());
assert(m.begin() == m.end());
assert(m.get_allocator() == A());
}
#endif
}

View File

@@ -0,0 +1,85 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// multimap& operator=(initializer_list<value_type> il);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
{
typedef std::multimap<int, double> C;
typedef C::value_type V;
C m = {{20, 1}};
m =
{
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
};
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
C::const_iterator i = m.cbegin();
assert(*i == V(1, 1));
assert(*++i == V(1, 1.5));
assert(*++i == V(1, 2));
assert(*++i == V(2, 1));
assert(*++i == V(2, 1.5));
assert(*++i == V(2, 2));
assert(*++i == V(3, 1));
assert(*++i == V(3, 1.5));
assert(*++i == V(3, 2));
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> C;
typedef C::value_type V;
C m = {{20, 1}};
m =
{
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
};
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
C::const_iterator i = m.cbegin();
assert(*i == V(1, 1));
assert(*++i == V(1, 1.5));
assert(*++i == V(1, 2));
assert(*++i == V(2, 1));
assert(*++i == V(2, 1.5));
assert(*++i == V(2, 2));
assert(*++i == V(3, 1));
assert(*++i == V(3, 1.5));
assert(*++i == V(3, 2));
}
#endif
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
}

View File

@@ -0,0 +1,40 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// explicit multimap(const key_compare& comp);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "min_allocator.h"
int main()
{
{
typedef test_compare<std::less<int> > C;
std::multimap<int, double, C> m(C(3));
assert(m.empty());
assert(m.begin() == m.end());
assert(m.key_comp() == C(3));
}
#if __cplusplus >= 201103L
{
typedef test_compare<std::less<int> > C;
std::multimap<int, double, C, min_allocator<std::pair<const int, double>>> m(C(3));
assert(m.empty());
assert(m.begin() == m.end());
assert(m.key_comp() == C(3));
}
#endif
}

View File

@@ -0,0 +1,45 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// multimap(const key_compare& comp, const allocator_type& a);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
{
typedef test_compare<std::less<int> > C;
typedef test_allocator<std::pair<const int, double> > A;
std::multimap<int, double, C, A> m(C(4), A(5));
assert(m.empty());
assert(m.begin() == m.end());
assert(m.key_comp() == C(4));
assert(m.get_allocator() == A(5));
}
#if __cplusplus >= 201103L
{
typedef test_compare<std::less<int> > C;
typedef min_allocator<std::pair<const int, double> > A;
std::multimap<int, double, C, A> m(C(4), A());
assert(m.empty());
assert(m.begin() == m.end());
assert(m.key_comp() == C(4));
assert(m.get_allocator() == A());
}
#endif
}

View File

@@ -0,0 +1,104 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// multimap(const multimap& m);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef test_allocator<V> A;
std::multimap<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(7));
std::multimap<int, double, C, A> m = mo;
assert(m == mo);
assert(m.get_allocator() == A(7));
assert(m.key_comp() == C(5));
assert(mo.get_allocator() == A(7));
assert(mo.key_comp() == C(5));
}
#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef other_allocator<V> A;
std::multimap<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(7));
std::multimap<int, double, C, A> m = mo;
assert(m == mo);
assert(m.get_allocator() == A(-2));
assert(m.key_comp() == C(5));
assert(mo.get_allocator() == A(7));
assert(mo.key_comp() == C(5));
}
#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef min_allocator<V> A;
std::multimap<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A());
std::multimap<int, double, C, A> m = mo;
assert(m == mo);
assert(m.get_allocator() == A());
assert(m.key_comp() == C(5));
assert(mo.get_allocator() == A());
assert(mo.key_comp() == C(5));
}
#endif
}

View File

@@ -0,0 +1,77 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// multimap(const multimap& m, const allocator_type& a);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef test_allocator<V> A;
std::multimap<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(7));
std::multimap<int, double, C, A> m(mo, A(3));
assert(m == mo);
assert(m.get_allocator() == A(3));
assert(m.key_comp() == C(5));
assert(mo.get_allocator() == A(7));
assert(mo.key_comp() == C(5));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef min_allocator<V> A;
std::multimap<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A());
std::multimap<int, double, C, A> m(mo, A());
assert(m == mo);
assert(m.get_allocator() == A());
assert(m.key_comp() == C(5));
assert(mo.get_allocator() == A());
assert(mo.key_comp() == C(5));
}
#endif
}

View File

@@ -0,0 +1,125 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// multimap& operator=(const multimap& m);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef test_allocator<V> A;
std::multimap<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(2));
std::multimap<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0])/2, C(3), A(7));
m = mo;
assert(m == mo);
assert(m.get_allocator() == A(7));
assert(m.key_comp() == C(5));
assert(mo.get_allocator() == A(2));
assert(mo.key_comp() == C(5));
}
{
typedef std::pair<const int, double> V;
const V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
std::multimap<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
std::multimap<int, double> *p = &m;
m = *p;
assert(m.size() == sizeof(ar)/sizeof(ar[0]));
assert(std::equal(m.begin(), m.end(), ar));
}
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef other_allocator<V> A;
std::multimap<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(2));
std::multimap<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0])/2, C(3), A(7));
m = mo;
assert(m == mo);
assert(m.get_allocator() == A(2));
assert(m.key_comp() == C(5));
assert(mo.get_allocator() == A(2));
assert(mo.key_comp() == C(5));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef min_allocator<V> A;
std::multimap<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A());
std::multimap<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0])/2, C(3), A());
m = mo;
assert(m == mo);
assert(m.get_allocator() == A());
assert(m.key_comp() == C(5));
assert(mo.get_allocator() == A());
assert(mo.key_comp() == C(5));
}
#endif
}

View File

@@ -0,0 +1,40 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// multimap();
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
std::multimap<int, double> m;
assert(m.empty());
assert(m.begin() == m.end());
}
#if __cplusplus >= 201103L
{
std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> m;
assert(m.empty());
assert(m.begin() == m.end());
}
{
std::multimap<int, double> m = {};
assert(m.empty());
assert(m.begin() == m.end());
}
#endif
}

View File

@@ -0,0 +1,53 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// multimap()
// noexcept(
// is_nothrow_default_constructible<allocator_type>::value &&
// is_nothrow_default_constructible<key_compare>::value &&
// is_nothrow_copy_constructible<key_compare>::value);
// This tests a conforming extension
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "test_allocator.h"
template <class T>
struct some_comp
{
typedef T value_type;
some_comp();
};
int main()
{
#if __has_feature(cxx_noexcept)
{
typedef std::multimap<MoveOnly, MoveOnly> C;
static_assert(std::is_nothrow_default_constructible<C>::value, "");
}
{
typedef std::multimap<MoveOnly, MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C;
static_assert(std::is_nothrow_default_constructible<C>::value, "");
}
{
typedef std::multimap<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C;
static_assert(!std::is_nothrow_default_constructible<C>::value, "");
}
{
typedef std::multimap<MoveOnly, MoveOnly, some_comp<MoveOnly>> C;
static_assert(!std::is_nothrow_default_constructible<C>::value, "");
}
#endif
}

View File

@@ -0,0 +1,51 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// ~multimap() // implied noexcept;
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "test_allocator.h"
#if __has_feature(cxx_noexcept)
template <class T>
struct some_comp
{
typedef T value_type;
~some_comp() noexcept(false);
};
#endif
int main()
{
#if __has_feature(cxx_noexcept)
{
typedef std::multimap<MoveOnly, MoveOnly> C;
static_assert(std::is_nothrow_destructible<C>::value, "");
}
{
typedef std::multimap<MoveOnly, MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C;
static_assert(std::is_nothrow_destructible<C>::value, "");
}
{
typedef std::multimap<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C;
static_assert(std::is_nothrow_destructible<C>::value, "");
}
{
typedef std::multimap<MoveOnly, MoveOnly, some_comp<MoveOnly>> C;
static_assert(!std::is_nothrow_destructible<C>::value, "");
}
#endif
}

View File

@@ -0,0 +1,83 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
{
typedef std::multimap<int, double> C;
typedef C::value_type V;
C m =
{
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
};
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
C::const_iterator i = m.cbegin();
assert(*i == V(1, 1));
assert(*++i == V(1, 1.5));
assert(*++i == V(1, 2));
assert(*++i == V(2, 1));
assert(*++i == V(2, 1.5));
assert(*++i == V(2, 2));
assert(*++i == V(3, 1));
assert(*++i == V(3, 1.5));
assert(*++i == V(3, 2));
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> C;
typedef C::value_type V;
C m =
{
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
};
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
C::const_iterator i = m.cbegin();
assert(*i == V(1, 1));
assert(*++i == V(1, 1.5));
assert(*++i == V(1, 2));
assert(*++i == V(2, 1));
assert(*++i == V(2, 1.5));
assert(*++i == V(2, 2));
assert(*++i == V(3, 1));
assert(*++i == V(3, 1.5));
assert(*++i == V(3, 2));
}
#endif
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
}

View File

@@ -0,0 +1,91 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
{
typedef test_compare<std::less<int> > Cmp;
typedef std::multimap<int, double, Cmp> C;
typedef C::value_type V;
C m(
{
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
},
Cmp(4)
);
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
C::const_iterator i = m.cbegin();
assert(*i == V(1, 1));
assert(*++i == V(1, 1.5));
assert(*++i == V(1, 2));
assert(*++i == V(2, 1));
assert(*++i == V(2, 1.5));
assert(*++i == V(2, 2));
assert(*++i == V(3, 1));
assert(*++i == V(3, 1.5));
assert(*++i == V(3, 2));
assert(m.key_comp() == Cmp(4));
}
#if __cplusplus >= 201103L
{
typedef test_compare<std::less<int> > Cmp;
typedef std::multimap<int, double, Cmp, min_allocator<std::pair<const int, double>>> C;
typedef C::value_type V;
C m(
{
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
},
Cmp(4)
);
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
C::const_iterator i = m.cbegin();
assert(*i == V(1, 1));
assert(*++i == V(1, 1.5));
assert(*++i == V(1, 2));
assert(*++i == V(2, 1));
assert(*++i == V(2, 1.5));
assert(*++i == V(2, 2));
assert(*++i == V(3, 1));
assert(*++i == V(3, 1.5));
assert(*++i == V(3, 2));
assert(m.key_comp() == Cmp(4));
}
#endif
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
}

View File

@@ -0,0 +1,129 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// multimap(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
{
typedef test_compare<std::less<int> > Cmp;
typedef test_allocator<std::pair<const int, double> > A;
typedef std::multimap<int, double, Cmp, A> C;
typedef C::value_type V;
C m(
{
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
},
Cmp(4), A(5)
);
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
C::const_iterator i = m.cbegin();
assert(*i == V(1, 1));
assert(*++i == V(1, 1.5));
assert(*++i == V(1, 2));
assert(*++i == V(2, 1));
assert(*++i == V(2, 1.5));
assert(*++i == V(2, 2));
assert(*++i == V(3, 1));
assert(*++i == V(3, 1.5));
assert(*++i == V(3, 2));
assert(m.key_comp() == Cmp(4));
assert(m.get_allocator() == A(5));
}
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
#if __cplusplus >= 201103L
{
typedef test_compare<std::less<int> > Cmp;
typedef min_allocator<std::pair<const int, double> > A;
typedef std::multimap<int, double, Cmp, A> C;
typedef C::value_type V;
C m(
{
{1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
},
Cmp(4), A()
);
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
C::const_iterator i = m.cbegin();
assert(*i == V(1, 1));
assert(*++i == V(1, 1.5));
assert(*++i == V(1, 2));
assert(*++i == V(2, 1));
assert(*++i == V(2, 1.5));
assert(*++i == V(2, 2));
assert(*++i == V(3, 1));
assert(*++i == V(3, 1.5));
assert(*++i == V(3, 2));
assert(m.key_comp() == Cmp(4));
assert(m.get_allocator() == A());
}
#if _LIBCPP_STD_VER > 11
{
typedef test_compare<std::less<int> > C;
typedef std::pair<const int, double> V;
typedef min_allocator<V> A;
typedef std::multimap<int, double, C, A> M;
A a;
M m ({ {1, 1},
{1, 1.5},
{1, 2},
{2, 1},
{2, 1.5},
{2, 2},
{3, 1},
{3, 1.5},
{3, 2}
}, a);
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
M::const_iterator i = m.cbegin();
assert(*i == V(1, 1));
assert(*++i == V(1, 1.5));
assert(*++i == V(1, 2));
assert(*++i == V(2, 1));
assert(*++i == V(2, 1.5));
assert(*++i == V(2, 2));
assert(*++i == V(3, 1));
assert(*++i == V(3, 1.5));
assert(*++i == V(3, 2));
assert(m.get_allocator() == a);
}
#endif
#endif
}

View File

@@ -0,0 +1,112 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// template <class InputIterator>
// multimap(InputIterator first, InputIterator last);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
std::multimap<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(1, 1.5));
assert(*next(m.begin(), 2) == V(1, 2));
assert(*next(m.begin(), 3) == V(2, 1));
assert(*next(m.begin(), 4) == V(2, 1.5));
assert(*next(m.begin(), 5) == V(2, 2));
assert(*next(m.begin(), 6) == V(3, 1));
assert(*next(m.begin(), 7) == V(3, 1.5));
assert(*next(m.begin(), 8) == V(3, 2));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
std::multimap<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(1, 1.5));
assert(*next(m.begin(), 2) == V(1, 2));
assert(*next(m.begin(), 3) == V(2, 1));
assert(*next(m.begin(), 4) == V(2, 1.5));
assert(*next(m.begin(), 5) == V(2, 2));
assert(*next(m.begin(), 6) == V(3, 1));
assert(*next(m.begin(), 7) == V(3, 1.5));
assert(*next(m.begin(), 8) == V(3, 2));
}
#if _LIBCPP_STD_VER > 11
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef min_allocator<std::pair<const int, double>> A;
A a;
std::multimap<int, double, std::less<int>, A> m(ar, ar+sizeof(ar)/sizeof(ar[0]), a);
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(1, 1.5));
assert(*next(m.begin(), 2) == V(1, 2));
assert(*next(m.begin(), 3) == V(2, 1));
assert(*next(m.begin(), 4) == V(2, 1.5));
assert(*next(m.begin(), 5) == V(2, 2));
assert(*next(m.begin(), 6) == V(3, 1));
assert(*next(m.begin(), 7) == V(3, 1.5));
assert(*next(m.begin(), 8) == V(3, 2));
assert(m.get_allocator() == a);
}
#endif
#endif
}

View File

@@ -0,0 +1,86 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// template <class InputIterator>
// multimap(InputIterator first, InputIterator last,
// const key_compare& comp);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
std::multimap<int, double, C> m(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5));
assert(m.key_comp() == C(5));
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(1, 1.5));
assert(*next(m.begin(), 2) == V(1, 2));
assert(*next(m.begin(), 3) == V(2, 1));
assert(*next(m.begin(), 4) == V(2, 1.5));
assert(*next(m.begin(), 5) == V(2, 2));
assert(*next(m.begin(), 6) == V(3, 1));
assert(*next(m.begin(), 7) == V(3, 1.5));
assert(*next(m.begin(), 8) == V(3, 2));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
std::multimap<int, double, C, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5));
assert(m.key_comp() == C(5));
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(1, 1.5));
assert(*next(m.begin(), 2) == V(1, 2));
assert(*next(m.begin(), 3) == V(2, 1));
assert(*next(m.begin(), 4) == V(2, 1.5));
assert(*next(m.begin(), 5) == V(2, 2));
assert(*next(m.begin(), 6) == V(3, 1));
assert(*next(m.begin(), 7) == V(3, 1.5));
assert(*next(m.begin(), 8) == V(3, 2));
}
#endif
}

View File

@@ -0,0 +1,91 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// template <class InputIterator>
// multimap(InputIterator first, InputIterator last,
// const key_compare& comp, const allocator_type& a);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef test_allocator<V> A;
std::multimap<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(7));
assert(m.get_allocator() == A(7));
assert(m.key_comp() == C(5));
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(1, 1.5));
assert(*next(m.begin(), 2) == V(1, 2));
assert(*next(m.begin(), 3) == V(2, 1));
assert(*next(m.begin(), 4) == V(2, 1.5));
assert(*next(m.begin(), 5) == V(2, 2));
assert(*next(m.begin(), 6) == V(3, 1));
assert(*next(m.begin(), 7) == V(3, 1.5));
assert(*next(m.begin(), 8) == V(3, 2));
}
#if __cplusplus >= 201103L
{
typedef std::pair<const int, double> V;
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef min_allocator<V> A;
std::multimap<int, double, C, A> m(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A());
assert(m.get_allocator() == A());
assert(m.key_comp() == C(5));
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(1, 1.5));
assert(*next(m.begin(), 2) == V(1, 2));
assert(*next(m.begin(), 3) == V(2, 1));
assert(*next(m.begin(), 4) == V(2, 1.5));
assert(*next(m.begin(), 5) == V(2, 2));
assert(*next(m.begin(), 6) == V(3, 1));
assert(*next(m.begin(), 7) == V(3, 1.5));
assert(*next(m.begin(), 8) == V(3, 2));
}
#endif
}

View File

@@ -0,0 +1,132 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// multimap(multimap&& m);
#include <map>
#include <cassert>
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
typedef std::pair<const int, double> V;
{
typedef test_compare<std::less<int> > C;
typedef test_allocator<V> A;
std::multimap<int, double, C, A> mo(C(5), A(7));
std::multimap<int, double, C, A> m = std::move(mo);
assert(m.get_allocator() == A(7));
assert(m.key_comp() == C(5));
assert(m.size() == 0);
assert(distance(m.begin(), m.end()) == 0);
assert(mo.get_allocator() == A(7));
assert(mo.key_comp() == C(5));
assert(mo.size() == 0);
assert(distance(mo.begin(), mo.end()) == 0);
}
{
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef test_allocator<V> A;
std::multimap<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A(7));
std::multimap<int, double, C, A> m = std::move(mo);
assert(m.get_allocator() == A(7));
assert(m.key_comp() == C(5));
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(1, 1.5));
assert(*next(m.begin(), 2) == V(1, 2));
assert(*next(m.begin(), 3) == V(2, 1));
assert(*next(m.begin(), 4) == V(2, 1.5));
assert(*next(m.begin(), 5) == V(2, 2));
assert(*next(m.begin(), 6) == V(3, 1));
assert(*next(m.begin(), 7) == V(3, 1.5));
assert(*next(m.begin(), 8) == V(3, 2));
assert(mo.get_allocator() == A(7));
assert(mo.key_comp() == C(5));
assert(mo.size() == 0);
assert(distance(mo.begin(), mo.end()) == 0);
}
#if __cplusplus >= 201103L
{
typedef test_compare<std::less<int> > C;
typedef min_allocator<V> A;
std::multimap<int, double, C, A> mo(C(5), A());
std::multimap<int, double, C, A> m = std::move(mo);
assert(m.get_allocator() == A());
assert(m.key_comp() == C(5));
assert(m.size() == 0);
assert(distance(m.begin(), m.end()) == 0);
assert(mo.get_allocator() == A());
assert(mo.key_comp() == C(5));
assert(mo.size() == 0);
assert(distance(mo.begin(), mo.end()) == 0);
}
{
V ar[] =
{
V(1, 1),
V(1, 1.5),
V(1, 2),
V(2, 1),
V(2, 1.5),
V(2, 2),
V(3, 1),
V(3, 1.5),
V(3, 2),
};
typedef test_compare<std::less<int> > C;
typedef min_allocator<V> A;
std::multimap<int, double, C, A> mo(ar, ar+sizeof(ar)/sizeof(ar[0]), C(5), A());
std::multimap<int, double, C, A> m = std::move(mo);
assert(m.get_allocator() == A());
assert(m.key_comp() == C(5));
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
assert(*m.begin() == V(1, 1));
assert(*next(m.begin()) == V(1, 1.5));
assert(*next(m.begin(), 2) == V(1, 2));
assert(*next(m.begin(), 3) == V(2, 1));
assert(*next(m.begin(), 4) == V(2, 1.5));
assert(*next(m.begin(), 5) == V(2, 2));
assert(*next(m.begin(), 6) == V(3, 1));
assert(*next(m.begin(), 7) == V(3, 1.5));
assert(*next(m.begin(), 8) == V(3, 2));
assert(mo.get_allocator() == A());
assert(mo.key_comp() == C(5));
assert(mo.size() == 0);
assert(distance(mo.begin(), mo.end()) == 0);
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,186 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// multimap(multimap&& m, const allocator_type& a);
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef test_allocator<VC> A;
typedef std::multimap<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
M m3(std::move(m1), A(7));
assert(m3 == m2);
assert(m3.get_allocator() == A(7));
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef test_allocator<VC> A;
typedef std::multimap<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
M m3(std::move(m1), A(5));
assert(m3 == m2);
assert(m3.get_allocator() == A(5));
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef other_allocator<VC> A;
typedef std::multimap<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
M m3(std::move(m1), A(5));
assert(m3 == m2);
assert(m3.get_allocator() == A(5));
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
#if __cplusplus >= 201103L
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef min_allocator<VC> A;
typedef std::multimap<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A());
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A());
M m3(std::move(m1), A());
assert(m3 == m2);
assert(m3.get_allocator() == A());
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,190 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// multimap& operator=(multimap&& m);
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "../../../test_compare.h"
#include "test_allocator.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef test_allocator<VC> A;
typedef std::multimap<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
M m3(C(3), A(7));
m3 = std::move(m1);
assert(m3 == m2);
assert(m3.get_allocator() == A(7));
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef test_allocator<VC> A;
typedef std::multimap<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
M m3(C(3), A(5));
m3 = std::move(m1);
assert(m3 == m2);
assert(m3.get_allocator() == A(5));
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef other_allocator<VC> A;
typedef std::multimap<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
M m3(C(3), A(5));
m3 = std::move(m1);
assert(m3 == m2);
assert(m3.get_allocator() == A(7));
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
#if __cplusplus >= 201103L
{
typedef std::pair<MoveOnly, MoveOnly> V;
typedef std::pair<const MoveOnly, MoveOnly> VC;
typedef test_compare<std::less<MoveOnly> > C;
typedef min_allocator<VC> A;
typedef std::multimap<MoveOnly, MoveOnly, C, A> M;
typedef std::move_iterator<V*> I;
V a1[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A());
V a2[] =
{
V(1, 1),
V(1, 2),
V(1, 3),
V(2, 1),
V(2, 2),
V(2, 3),
V(3, 1),
V(3, 2),
V(3, 3)
};
M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A());
M m3(C(3), A());
m3 = std::move(m1);
assert(m3 == m2);
assert(m3.get_allocator() == A());
assert(m3.key_comp() == C(5));
assert(m1.empty());
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,53 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// multimap& operator=(multimap&& c)
// noexcept(
// allocator_type::propagate_on_container_move_assignment::value &&
// is_nothrow_move_assignable<allocator_type>::value &&
// is_nothrow_move_assignable<key_compare>::value);
// This tests a conforming extension
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "test_allocator.h"
template <class T>
struct some_comp
{
typedef T value_type;
some_comp& operator=(const some_comp&);
};
int main()
{
#if __has_feature(cxx_noexcept)
{
typedef std::multimap<MoveOnly, MoveOnly> C;
static_assert(std::is_nothrow_move_assignable<C>::value, "");
}
{
typedef std::multimap<MoveOnly, MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C;
static_assert(!std::is_nothrow_move_assignable<C>::value, "");
}
{
typedef std::multimap<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C;
static_assert(std::is_nothrow_move_assignable<C>::value, "");
}
{
typedef std::multimap<MoveOnly, MoveOnly, some_comp<MoveOnly>> C;
static_assert(!std::is_nothrow_move_assignable<C>::value, "");
}
#endif
}

View File

@@ -0,0 +1,51 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// multimap(multimap&&)
// noexcept(is_nothrow_move_constructible<allocator_type>::value &&
// is_nothrow_move_constructible<key_compare>::value);
// This tests a conforming extension
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "test_allocator.h"
template <class T>
struct some_comp
{
typedef T value_type;
some_comp(const some_comp&);
};
int main()
{
#if __has_feature(cxx_noexcept)
{
typedef std::multimap<MoveOnly, MoveOnly> C;
static_assert(std::is_nothrow_move_constructible<C>::value, "");
}
{
typedef std::multimap<MoveOnly, MoveOnly, std::less<MoveOnly>, test_allocator<MoveOnly>> C;
static_assert(std::is_nothrow_move_constructible<C>::value, "");
}
{
typedef std::multimap<MoveOnly, MoveOnly, std::less<MoveOnly>, other_allocator<MoveOnly>> C;
static_assert(std::is_nothrow_move_constructible<C>::value, "");
}
{
typedef std::multimap<MoveOnly, MoveOnly, some_comp<MoveOnly>> C;
static_assert(!std::is_nothrow_move_constructible<C>::value, "");
}
#endif
}

View File

@@ -0,0 +1,63 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// void clear();
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::multimap<int, double> M;
typedef std::pair<int, double> P;
P ar[] =
{
P(1, 1.5),
P(2, 2.5),
P(3, 3.5),
P(4, 4.5),
P(5, 5.5),
P(6, 6.5),
P(7, 7.5),
P(8, 8.5),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 8);
m.clear();
assert(m.size() == 0);
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef std::pair<int, double> P;
P ar[] =
{
P(1, 1.5),
P(2, 2.5),
P(3, 3.5),
P(4, 4.5),
P(5, 5.5),
P(6, 6.5),
P(7, 7.5),
P(8, 8.5),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 8);
m.clear();
assert(m.size() == 0);
}
#endif
}

View File

@@ -0,0 +1,150 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// template <class... Args>
// iterator emplace(Args&&... args);
#include <map>
#include <cassert>
#include "../../../Emplaceable.h"
#include "DefaultOnly.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
typedef std::multimap<int, DefaultOnly> M;
typedef M::iterator R;
M m;
assert(DefaultOnly::count == 0);
R r = m.emplace();
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 0);
assert(m.begin()->second == DefaultOnly());
assert(DefaultOnly::count == 1);
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r == next(m.begin()));
assert(m.size() == 2);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == DefaultOnly());
assert(DefaultOnly::count == 2);
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r == next(m.begin(), 2));
assert(m.size() == 3);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == DefaultOnly());
assert(DefaultOnly::count == 3);
}
assert(DefaultOnly::count == 0);
{
typedef std::multimap<int, Emplaceable> M;
typedef M::iterator R;
M m;
R r = m.emplace(std::piecewise_construct, std::forward_as_tuple(2),
std::forward_as_tuple());
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == Emplaceable());
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple(2, 3.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(m.begin()->first == 1);
assert(m.begin()->second == Emplaceable(2, 3.5));
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple(3, 3.5));
assert(r == next(m.begin()));
assert(m.size() == 3);
assert(r->first == 1);
assert(r->second == Emplaceable(3, 3.5));
}
{
typedef std::multimap<int, double> M;
typedef M::iterator R;
M m;
R r = m.emplace(M::value_type(2, 3.5));
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 3.5);
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, DefaultOnly, std::less<int>, min_allocator<std::pair<const int, DefaultOnly>>> M;
typedef M::iterator R;
M m;
assert(DefaultOnly::count == 0);
R r = m.emplace();
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 0);
assert(m.begin()->second == DefaultOnly());
assert(DefaultOnly::count == 1);
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r == next(m.begin()));
assert(m.size() == 2);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == DefaultOnly());
assert(DefaultOnly::count == 2);
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r == next(m.begin(), 2));
assert(m.size() == 3);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == DefaultOnly());
assert(DefaultOnly::count == 3);
}
assert(DefaultOnly::count == 0);
{
typedef std::multimap<int, Emplaceable, std::less<int>, min_allocator<std::pair<const int, Emplaceable>>> M;
typedef M::iterator R;
M m;
R r = m.emplace(std::piecewise_construct, std::forward_as_tuple(2),
std::forward_as_tuple());
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == Emplaceable());
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple(2, 3.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(m.begin()->first == 1);
assert(m.begin()->second == Emplaceable(2, 3.5));
r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
std::forward_as_tuple(3, 3.5));
assert(r == next(m.begin()));
assert(m.size() == 3);
assert(r->first == 1);
assert(r->second == Emplaceable(3, 3.5));
}
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef M::iterator R;
M m;
R r = m.emplace(M::value_type(2, 3.5));
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 3.5);
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,160 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// template <class... Args>
// iterator emplace_hint(const_iterator position, Args&&... args);
#include <map>
#include <cassert>
#include "../../../Emplaceable.h"
#include "DefaultOnly.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
typedef std::multimap<int, DefaultOnly> M;
typedef M::iterator R;
M m;
assert(DefaultOnly::count == 0);
R r = m.emplace_hint(m.cend());
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 0);
assert(m.begin()->second == DefaultOnly());
assert(DefaultOnly::count == 1);
r = m.emplace_hint(m.cend(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r == next(m.begin()));
assert(m.size() == 2);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == DefaultOnly());
assert(DefaultOnly::count == 2);
r = m.emplace_hint(m.cend(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r == next(m.begin(), 2));
assert(m.size() == 3);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == DefaultOnly());
assert(DefaultOnly::count == 3);
}
assert(DefaultOnly::count == 0);
{
typedef std::multimap<int, Emplaceable> M;
typedef M::iterator R;
M m;
R r = m.emplace_hint(m.cend(), std::piecewise_construct,
std::forward_as_tuple(2),
std::forward_as_tuple());
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == Emplaceable());
r = m.emplace_hint(m.cbegin(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(2, 3.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(m.begin()->first == 1);
assert(m.begin()->second == Emplaceable(2, 3.5));
r = m.emplace_hint(m.cbegin(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(3, 3.5));
assert(r == m.begin());
assert(m.size() == 3);
assert(r->first == 1);
assert(r->second == Emplaceable(3, 3.5));
}
{
typedef std::multimap<int, double> M;
typedef M::iterator R;
M m;
R r = m.emplace_hint(m.cend(), M::value_type(2, 3.5));
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 3.5);
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, DefaultOnly, std::less<int>, min_allocator<std::pair<const int, DefaultOnly>>> M;
typedef M::iterator R;
M m;
assert(DefaultOnly::count == 0);
R r = m.emplace_hint(m.cend());
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 0);
assert(m.begin()->second == DefaultOnly());
assert(DefaultOnly::count == 1);
r = m.emplace_hint(m.cend(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r == next(m.begin()));
assert(m.size() == 2);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == DefaultOnly());
assert(DefaultOnly::count == 2);
r = m.emplace_hint(m.cend(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple());
assert(r == next(m.begin(), 2));
assert(m.size() == 3);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == DefaultOnly());
assert(DefaultOnly::count == 3);
}
assert(DefaultOnly::count == 0);
{
typedef std::multimap<int, Emplaceable, std::less<int>, min_allocator<std::pair<const int, Emplaceable>>> M;
typedef M::iterator R;
M m;
R r = m.emplace_hint(m.cend(), std::piecewise_construct,
std::forward_as_tuple(2),
std::forward_as_tuple());
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == Emplaceable());
r = m.emplace_hint(m.cbegin(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(2, 3.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(m.begin()->first == 1);
assert(m.begin()->second == Emplaceable(2, 3.5));
r = m.emplace_hint(m.cbegin(), std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(3, 3.5));
assert(r == m.begin());
assert(m.size() == 3);
assert(r->first == 1);
assert(r->second == Emplaceable(3, 3.5));
}
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef M::iterator R;
M m;
R r = m.emplace_hint(m.cend(), M::value_type(2, 3.5));
assert(r == m.begin());
assert(m.size() == 1);
assert(m.begin()->first == 2);
assert(m.begin()->second == 3.5);
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,279 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// iterator erase(const_iterator position);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::multimap<int, double> M;
typedef std::pair<int, double> P;
typedef M::iterator I;
P ar[] =
{
P(1, 1),
P(1, 1.5),
P(1, 2),
P(2, 1),
P(2, 1.5),
P(2, 2),
P(3, 1),
P(3, 1.5),
P(3, 2),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 9);
I i = m.erase(next(m.cbegin(), 3));
assert(m.size() == 8);
assert(i == next(m.begin(), 3));
assert(m.begin()->first == 1);
assert(m.begin()->second == 1);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == 1.5);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == 2);
assert(next(m.begin(), 3)->first == 2);
assert(next(m.begin(), 3)->second == 1.5);
assert(next(m.begin(), 4)->first == 2);
assert(next(m.begin(), 4)->second == 2);
assert(next(m.begin(), 5)->first == 3);
assert(next(m.begin(), 5)->second == 1);
assert(next(m.begin(), 6)->first == 3);
assert(next(m.begin(), 6)->second == 1.5);
assert(next(m.begin(), 7)->first == 3);
assert(next(m.begin(), 7)->second == 2);
i = m.erase(next(m.cbegin(), 0));
assert(m.size() == 7);
assert(i == m.begin());
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1.5);
assert(next(m.begin(), 1)->first == 1);
assert(next(m.begin(), 1)->second == 2);
assert(next(m.begin(), 2)->first == 2);
assert(next(m.begin(), 2)->second == 1.5);
assert(next(m.begin(), 3)->first == 2);
assert(next(m.begin(), 3)->second == 2);
assert(next(m.begin(), 4)->first == 3);
assert(next(m.begin(), 4)->second == 1);
assert(next(m.begin(), 5)->first == 3);
assert(next(m.begin(), 5)->second == 1.5);
assert(next(m.begin(), 6)->first == 3);
assert(next(m.begin(), 6)->second == 2);
i = m.erase(next(m.cbegin(), 5));
assert(m.size() == 6);
assert(i == prev(m.end()));
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1.5);
assert(next(m.begin(), 1)->first == 1);
assert(next(m.begin(), 1)->second == 2);
assert(next(m.begin(), 2)->first == 2);
assert(next(m.begin(), 2)->second == 1.5);
assert(next(m.begin(), 3)->first == 2);
assert(next(m.begin(), 3)->second == 2);
assert(next(m.begin(), 4)->first == 3);
assert(next(m.begin(), 4)->second == 1);
assert(next(m.begin(), 5)->first == 3);
assert(next(m.begin(), 5)->second == 2);
i = m.erase(next(m.cbegin(), 1));
assert(m.size() == 5);
assert(i == next(m.begin()));
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1.5);
assert(next(m.begin(), 1)->first == 2);
assert(next(m.begin(), 1)->second == 1.5);
assert(next(m.begin(), 2)->first == 2);
assert(next(m.begin(), 2)->second == 2);
assert(next(m.begin(), 3)->first == 3);
assert(next(m.begin(), 3)->second == 1);
assert(next(m.begin(), 4)->first == 3);
assert(next(m.begin(), 4)->second == 2);
i = m.erase(next(m.cbegin(), 2));
assert(m.size() == 4);
assert(i == next(m.begin(), 2));
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1.5);
assert(next(m.begin(), 1)->first == 2);
assert(next(m.begin(), 1)->second == 1.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 1);
assert(next(m.begin(), 3)->first == 3);
assert(next(m.begin(), 3)->second == 2);
i = m.erase(next(m.cbegin(), 2));
assert(m.size() == 3);
assert(i == next(m.begin(), 2));
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1.5);
assert(next(m.begin(), 1)->first == 2);
assert(next(m.begin(), 1)->second == 1.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 2);
i = m.erase(next(m.cbegin(), 0));
assert(m.size() == 2);
assert(i == next(m.begin(), 0));
assert(next(m.begin(), 0)->first == 2);
assert(next(m.begin(), 0)->second == 1.5);
assert(next(m.begin(), 1)->first == 3);
assert(next(m.begin(), 1)->second == 2);
i = m.erase(next(m.cbegin(), 1));
assert(m.size() == 1);
assert(i == m.end());
assert(next(m.begin(), 0)->first == 2);
assert(next(m.begin(), 0)->second == 1.5);
i = m.erase(m.cbegin());
assert(m.size() == 0);
assert(i == m.begin());
assert(i == m.end());
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef std::pair<int, double> P;
typedef M::iterator I;
P ar[] =
{
P(1, 1),
P(1, 1.5),
P(1, 2),
P(2, 1),
P(2, 1.5),
P(2, 2),
P(3, 1),
P(3, 1.5),
P(3, 2),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 9);
I i = m.erase(next(m.cbegin(), 3));
assert(m.size() == 8);
assert(i == next(m.begin(), 3));
assert(m.begin()->first == 1);
assert(m.begin()->second == 1);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == 1.5);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == 2);
assert(next(m.begin(), 3)->first == 2);
assert(next(m.begin(), 3)->second == 1.5);
assert(next(m.begin(), 4)->first == 2);
assert(next(m.begin(), 4)->second == 2);
assert(next(m.begin(), 5)->first == 3);
assert(next(m.begin(), 5)->second == 1);
assert(next(m.begin(), 6)->first == 3);
assert(next(m.begin(), 6)->second == 1.5);
assert(next(m.begin(), 7)->first == 3);
assert(next(m.begin(), 7)->second == 2);
i = m.erase(next(m.cbegin(), 0));
assert(m.size() == 7);
assert(i == m.begin());
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1.5);
assert(next(m.begin(), 1)->first == 1);
assert(next(m.begin(), 1)->second == 2);
assert(next(m.begin(), 2)->first == 2);
assert(next(m.begin(), 2)->second == 1.5);
assert(next(m.begin(), 3)->first == 2);
assert(next(m.begin(), 3)->second == 2);
assert(next(m.begin(), 4)->first == 3);
assert(next(m.begin(), 4)->second == 1);
assert(next(m.begin(), 5)->first == 3);
assert(next(m.begin(), 5)->second == 1.5);
assert(next(m.begin(), 6)->first == 3);
assert(next(m.begin(), 6)->second == 2);
i = m.erase(next(m.cbegin(), 5));
assert(m.size() == 6);
assert(i == prev(m.end()));
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1.5);
assert(next(m.begin(), 1)->first == 1);
assert(next(m.begin(), 1)->second == 2);
assert(next(m.begin(), 2)->first == 2);
assert(next(m.begin(), 2)->second == 1.5);
assert(next(m.begin(), 3)->first == 2);
assert(next(m.begin(), 3)->second == 2);
assert(next(m.begin(), 4)->first == 3);
assert(next(m.begin(), 4)->second == 1);
assert(next(m.begin(), 5)->first == 3);
assert(next(m.begin(), 5)->second == 2);
i = m.erase(next(m.cbegin(), 1));
assert(m.size() == 5);
assert(i == next(m.begin()));
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1.5);
assert(next(m.begin(), 1)->first == 2);
assert(next(m.begin(), 1)->second == 1.5);
assert(next(m.begin(), 2)->first == 2);
assert(next(m.begin(), 2)->second == 2);
assert(next(m.begin(), 3)->first == 3);
assert(next(m.begin(), 3)->second == 1);
assert(next(m.begin(), 4)->first == 3);
assert(next(m.begin(), 4)->second == 2);
i = m.erase(next(m.cbegin(), 2));
assert(m.size() == 4);
assert(i == next(m.begin(), 2));
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1.5);
assert(next(m.begin(), 1)->first == 2);
assert(next(m.begin(), 1)->second == 1.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 1);
assert(next(m.begin(), 3)->first == 3);
assert(next(m.begin(), 3)->second == 2);
i = m.erase(next(m.cbegin(), 2));
assert(m.size() == 3);
assert(i == next(m.begin(), 2));
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1.5);
assert(next(m.begin(), 1)->first == 2);
assert(next(m.begin(), 1)->second == 1.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 2);
i = m.erase(next(m.cbegin(), 0));
assert(m.size() == 2);
assert(i == next(m.begin(), 0));
assert(next(m.begin(), 0)->first == 2);
assert(next(m.begin(), 0)->second == 1.5);
assert(next(m.begin(), 1)->first == 3);
assert(next(m.begin(), 1)->second == 2);
i = m.erase(next(m.cbegin(), 1));
assert(m.size() == 1);
assert(i == m.end());
assert(next(m.begin(), 0)->first == 2);
assert(next(m.begin(), 0)->second == 1.5);
i = m.erase(m.cbegin());
assert(m.size() == 0);
assert(i == m.begin());
assert(i == m.end());
}
#endif
}

View File

@@ -0,0 +1,157 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// iterator erase(const_iterator first, const_iterator last);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::multimap<int, double> M;
typedef std::pair<int, double> P;
typedef M::iterator I;
P ar[] =
{
P(1, 1.5),
P(2, 2.5),
P(3, 3.5),
P(4, 4.5),
P(5, 5.5),
P(6, 6.5),
P(7, 7.5),
P(8, 8.5),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 8);
I i = m.erase(m.cbegin(), m.cbegin());
assert(m.size() == 8);
assert(i == m.begin());
assert(m.begin()->first == 1);
assert(m.begin()->second == 1.5);
assert(next(m.begin())->first == 2);
assert(next(m.begin())->second == 2.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 3.5);
assert(next(m.begin(), 3)->first == 4);
assert(next(m.begin(), 3)->second == 4.5);
assert(next(m.begin(), 4)->first == 5);
assert(next(m.begin(), 4)->second == 5.5);
assert(next(m.begin(), 5)->first == 6);
assert(next(m.begin(), 5)->second == 6.5);
assert(next(m.begin(), 6)->first == 7);
assert(next(m.begin(), 6)->second == 7.5);
assert(next(m.begin(), 7)->first == 8);
assert(next(m.begin(), 7)->second == 8.5);
i = m.erase(m.cbegin(), next(m.cbegin(), 2));
assert(m.size() == 6);
assert(i == m.begin());
assert(next(m.begin(), 0)->first == 3);
assert(next(m.begin(), 0)->second == 3.5);
assert(next(m.begin(), 1)->first == 4);
assert(next(m.begin(), 1)->second == 4.5);
assert(next(m.begin(), 2)->first == 5);
assert(next(m.begin(), 2)->second == 5.5);
assert(next(m.begin(), 3)->first == 6);
assert(next(m.begin(), 3)->second == 6.5);
assert(next(m.begin(), 4)->first == 7);
assert(next(m.begin(), 4)->second == 7.5);
assert(next(m.begin(), 5)->first == 8);
assert(next(m.begin(), 5)->second == 8.5);
i = m.erase(next(m.cbegin(), 2), next(m.cbegin(), 6));
assert(m.size() == 2);
assert(i == next(m.begin(), 2));
assert(next(m.begin(), 0)->first == 3);
assert(next(m.begin(), 0)->second == 3.5);
assert(next(m.begin(), 1)->first == 4);
assert(next(m.begin(), 1)->second == 4.5);
i = m.erase(m.cbegin(), m.cend());
assert(m.size() == 0);
assert(i == m.begin());
assert(i == m.end());
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef std::pair<int, double> P;
typedef M::iterator I;
P ar[] =
{
P(1, 1.5),
P(2, 2.5),
P(3, 3.5),
P(4, 4.5),
P(5, 5.5),
P(6, 6.5),
P(7, 7.5),
P(8, 8.5),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 8);
I i = m.erase(m.cbegin(), m.cbegin());
assert(m.size() == 8);
assert(i == m.begin());
assert(m.begin()->first == 1);
assert(m.begin()->second == 1.5);
assert(next(m.begin())->first == 2);
assert(next(m.begin())->second == 2.5);
assert(next(m.begin(), 2)->first == 3);
assert(next(m.begin(), 2)->second == 3.5);
assert(next(m.begin(), 3)->first == 4);
assert(next(m.begin(), 3)->second == 4.5);
assert(next(m.begin(), 4)->first == 5);
assert(next(m.begin(), 4)->second == 5.5);
assert(next(m.begin(), 5)->first == 6);
assert(next(m.begin(), 5)->second == 6.5);
assert(next(m.begin(), 6)->first == 7);
assert(next(m.begin(), 6)->second == 7.5);
assert(next(m.begin(), 7)->first == 8);
assert(next(m.begin(), 7)->second == 8.5);
i = m.erase(m.cbegin(), next(m.cbegin(), 2));
assert(m.size() == 6);
assert(i == m.begin());
assert(next(m.begin(), 0)->first == 3);
assert(next(m.begin(), 0)->second == 3.5);
assert(next(m.begin(), 1)->first == 4);
assert(next(m.begin(), 1)->second == 4.5);
assert(next(m.begin(), 2)->first == 5);
assert(next(m.begin(), 2)->second == 5.5);
assert(next(m.begin(), 3)->first == 6);
assert(next(m.begin(), 3)->second == 6.5);
assert(next(m.begin(), 4)->first == 7);
assert(next(m.begin(), 4)->second == 7.5);
assert(next(m.begin(), 5)->first == 8);
assert(next(m.begin(), 5)->second == 8.5);
i = m.erase(next(m.cbegin(), 2), next(m.cbegin(), 6));
assert(m.size() == 2);
assert(i == next(m.begin(), 2));
assert(next(m.begin(), 0)->first == 3);
assert(next(m.begin(), 0)->second == 3.5);
assert(next(m.begin(), 1)->first == 4);
assert(next(m.begin(), 1)->second == 4.5);
i = m.erase(m.cbegin(), m.cend());
assert(m.size() == 0);
assert(i == m.begin());
assert(i == m.end());
}
#endif
}

View File

@@ -0,0 +1,153 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// size_type erase(const key_type& k);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::multimap<int, double> M;
typedef std::pair<int, double> P;
typedef M::size_type I;
P ar[] =
{
P(1, 1),
P(1, 1.5),
P(1, 2),
P(2, 1),
P(2, 1.5),
P(2, 2),
P(3, 1),
P(3, 1.5),
P(3, 2),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 9);
I i = m.erase(2);
assert(m.size() == 6);
assert(i == 3);
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1);
assert(next(m.begin(), 1)->first == 1);
assert(next(m.begin(), 1)->second == 1.5);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == 2);
assert(next(m.begin(), 3)->first == 3);
assert(next(m.begin(), 3)->second == 1);
assert(next(m.begin(), 4)->first == 3);
assert(next(m.begin(), 4)->second == 1.5);
assert(next(m.begin(), 5)->first == 3);
assert(next(m.begin(), 5)->second == 2);
i = m.erase(2);
assert(m.size() == 6);
assert(i == 0);
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1);
assert(next(m.begin(), 1)->first == 1);
assert(next(m.begin(), 1)->second == 1.5);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == 2);
assert(next(m.begin(), 3)->first == 3);
assert(next(m.begin(), 3)->second == 1);
assert(next(m.begin(), 4)->first == 3);
assert(next(m.begin(), 4)->second == 1.5);
assert(next(m.begin(), 5)->first == 3);
assert(next(m.begin(), 5)->second == 2);
i = m.erase(3);
assert(i == 3);
assert(m.size() == 3);
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1);
assert(next(m.begin(), 1)->first == 1);
assert(next(m.begin(), 1)->second == 1.5);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == 2);
i = m.erase(1);
assert(m.size() == 0);
assert(i == 3);
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef std::pair<int, double> P;
typedef M::size_type I;
P ar[] =
{
P(1, 1),
P(1, 1.5),
P(1, 2),
P(2, 1),
P(2, 1.5),
P(2, 2),
P(3, 1),
P(3, 1.5),
P(3, 2),
};
M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
assert(m.size() == 9);
I i = m.erase(2);
assert(m.size() == 6);
assert(i == 3);
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1);
assert(next(m.begin(), 1)->first == 1);
assert(next(m.begin(), 1)->second == 1.5);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == 2);
assert(next(m.begin(), 3)->first == 3);
assert(next(m.begin(), 3)->second == 1);
assert(next(m.begin(), 4)->first == 3);
assert(next(m.begin(), 4)->second == 1.5);
assert(next(m.begin(), 5)->first == 3);
assert(next(m.begin(), 5)->second == 2);
i = m.erase(2);
assert(m.size() == 6);
assert(i == 0);
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1);
assert(next(m.begin(), 1)->first == 1);
assert(next(m.begin(), 1)->second == 1.5);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == 2);
assert(next(m.begin(), 3)->first == 3);
assert(next(m.begin(), 3)->second == 1);
assert(next(m.begin(), 4)->first == 3);
assert(next(m.begin(), 4)->second == 1.5);
assert(next(m.begin(), 5)->first == 3);
assert(next(m.begin(), 5)->second == 2);
i = m.erase(3);
assert(i == 3);
assert(m.size() == 3);
assert(next(m.begin(), 0)->first == 1);
assert(next(m.begin(), 0)->second == 1);
assert(next(m.begin(), 1)->first == 1);
assert(next(m.begin(), 1)->second == 1.5);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == 2);
i = m.erase(1);
assert(m.size() == 0);
assert(i == 3);
}
#endif
}

View File

@@ -0,0 +1,81 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// iterator insert(const value_type& v);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::multimap<int, double> M;
typedef M::iterator R;
M m;
R r = m.insert(M::value_type(2, 2.5));
assert(r == m.begin());
assert(m.size() == 1);
assert(r->first == 2);
assert(r->second == 2.5);
r = m.insert(M::value_type(1, 1.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(r->first == 1);
assert(r->second == 1.5);
r = m.insert(M::value_type(3, 3.5));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3.5);
r = m.insert(M::value_type(3, 3.5));
assert(r == prev(m.end()));
assert(m.size() == 4);
assert(r->first == 3);
assert(r->second == 3.5);
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef M::iterator R;
M m;
R r = m.insert(M::value_type(2, 2.5));
assert(r == m.begin());
assert(m.size() == 1);
assert(r->first == 2);
assert(r->second == 2.5);
r = m.insert(M::value_type(1, 1.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(r->first == 1);
assert(r->second == 1.5);
r = m.insert(M::value_type(3, 3.5));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3.5);
r = m.insert(M::value_type(3, 3.5));
assert(r == prev(m.end()));
assert(m.size() == 4);
assert(r->first == 3);
assert(r->second == 3.5);
}
#endif
}

View File

@@ -0,0 +1,91 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// void insert(initializer_list<value_type> il);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
{
typedef std::multimap<int, double> C;
typedef C::value_type V;
C m =
{
{1, 1},
{1, 2},
{2, 1},
{2, 2},
{3, 1},
{3, 2}
};
m.insert(
{
{1, 1.5},
{2, 1.5},
{3, 1.5},
}
);
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
C::const_iterator i = m.cbegin();
assert(*i == V(1, 1));
assert(*++i == V(1, 2));
assert(*++i == V(1, 1.5));
assert(*++i == V(2, 1));
assert(*++i == V(2, 2));
assert(*++i == V(2, 1.5));
assert(*++i == V(3, 1));
assert(*++i == V(3, 2));
assert(*++i == V(3, 1.5));
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> C;
typedef C::value_type V;
C m =
{
{1, 1},
{1, 2},
{2, 1},
{2, 2},
{3, 1},
{3, 2}
};
m.insert(
{
{1, 1.5},
{2, 1.5},
{3, 1.5},
}
);
assert(m.size() == 9);
assert(distance(m.begin(), m.end()) == 9);
C::const_iterator i = m.cbegin();
assert(*i == V(1, 1));
assert(*++i == V(1, 2));
assert(*++i == V(1, 1.5));
assert(*++i == V(2, 1));
assert(*++i == V(2, 2));
assert(*++i == V(2, 1.5));
assert(*++i == V(3, 1));
assert(*++i == V(3, 2));
assert(*++i == V(3, 1.5));
}
#endif
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
}

View File

@@ -0,0 +1,81 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// iterator insert(const_iterator position, const value_type& v);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
{
typedef std::multimap<int, double> M;
typedef M::iterator R;
M m;
R r = m.insert(m.end(), M::value_type(2, 2.5));
assert(r == m.begin());
assert(m.size() == 1);
assert(r->first == 2);
assert(r->second == 2.5);
r = m.insert(m.end(), M::value_type(1, 1.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(r->first == 1);
assert(r->second == 1.5);
r = m.insert(m.end(), M::value_type(3, 3.5));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3.5);
r = m.insert(prev(m.end()), M::value_type(3, 4.5));
assert(r == prev(m.end(), 2));
assert(m.size() == 4);
assert(r->first == 3);
assert(r->second == 4.5);
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef M::iterator R;
M m;
R r = m.insert(m.end(), M::value_type(2, 2.5));
assert(r == m.begin());
assert(m.size() == 1);
assert(r->first == 2);
assert(r->second == 2.5);
r = m.insert(m.end(), M::value_type(1, 1.5));
assert(r == m.begin());
assert(m.size() == 2);
assert(r->first == 1);
assert(r->second == 1.5);
r = m.insert(m.end(), M::value_type(3, 3.5));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3.5);
r = m.insert(prev(m.end()), M::value_type(3, 4.5));
assert(r == prev(m.end(), 2));
assert(m.size() == 4);
assert(r->first == 3);
assert(r->second == 4.5);
}
#endif
}

View File

@@ -0,0 +1,101 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// template <class InputIterator>
// void insert(InputIterator first, InputIterator last);
#include <map>
#include <cassert>
#include "test_iterators.h"
#include "min_allocator.h"
int main()
{
{
typedef std::multimap<int, double> M;
typedef std::pair<int, double> P;
P ar[] =
{
P(1, 1),
P(1, 1.5),
P(1, 2),
P(2, 1),
P(2, 1.5),
P(2, 2),
P(3, 1),
P(3, 1.5),
P(3, 2),
};
M m;
m.insert(input_iterator<P*>(ar), input_iterator<P*>(ar + sizeof(ar)/sizeof(ar[0])));
assert(m.size() == 9);
assert(m.begin()->first == 1);
assert(m.begin()->second == 1);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == 1.5);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == 2);
assert(next(m.begin(), 3)->first == 2);
assert(next(m.begin(), 3)->second == 1);
assert(next(m.begin(), 4)->first == 2);
assert(next(m.begin(), 4)->second == 1.5);
assert(next(m.begin(), 5)->first == 2);
assert(next(m.begin(), 5)->second == 2);
assert(next(m.begin(), 6)->first == 3);
assert(next(m.begin(), 6)->second == 1);
assert(next(m.begin(), 7)->first == 3);
assert(next(m.begin(), 7)->second == 1.5);
assert(next(m.begin(), 8)->first == 3);
assert(next(m.begin(), 8)->second == 2);
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
typedef std::pair<int, double> P;
P ar[] =
{
P(1, 1),
P(1, 1.5),
P(1, 2),
P(2, 1),
P(2, 1.5),
P(2, 2),
P(3, 1),
P(3, 1.5),
P(3, 2),
};
M m;
m.insert(input_iterator<P*>(ar), input_iterator<P*>(ar + sizeof(ar)/sizeof(ar[0])));
assert(m.size() == 9);
assert(m.begin()->first == 1);
assert(m.begin()->second == 1);
assert(next(m.begin())->first == 1);
assert(next(m.begin())->second == 1.5);
assert(next(m.begin(), 2)->first == 1);
assert(next(m.begin(), 2)->second == 2);
assert(next(m.begin(), 3)->first == 2);
assert(next(m.begin(), 3)->second == 1);
assert(next(m.begin(), 4)->first == 2);
assert(next(m.begin(), 4)->second == 1.5);
assert(next(m.begin(), 5)->first == 2);
assert(next(m.begin(), 5)->second == 2);
assert(next(m.begin(), 6)->first == 3);
assert(next(m.begin(), 6)->second == 1);
assert(next(m.begin(), 7)->first == 3);
assert(next(m.begin(), 7)->second == 1.5);
assert(next(m.begin(), 8)->first == 3);
assert(next(m.begin(), 8)->second == 2);
}
#endif
}

View File

@@ -0,0 +1,87 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// template <class P>
// iterator insert(const_iterator position, P&& p);
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
typedef std::multimap<int, MoveOnly> M;
typedef std::pair<int, MoveOnly> P;
typedef M::iterator R;
M m;
R r = m.insert(m.cend(), P(2, 2));
assert(r == m.begin());
assert(m.size() == 1);
assert(r->first == 2);
assert(r->second == 2);
r = m.insert(m.cend(), P(1, 1));
assert(r == m.begin());
assert(m.size() == 2);
assert(r->first == 1);
assert(r->second == 1);
r = m.insert(m.cend(), P(3, 3));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3);
r = m.insert(m.cend(), P(3, 2));
assert(r == prev(m.end()));
assert(m.size() == 4);
assert(r->first == 3);
assert(r->second == 2);
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, MoveOnly, std::less<int>, min_allocator<std::pair<const int, MoveOnly>>> M;
typedef std::pair<int, MoveOnly> P;
typedef M::iterator R;
M m;
R r = m.insert(m.cend(), P(2, 2));
assert(r == m.begin());
assert(m.size() == 1);
assert(r->first == 2);
assert(r->second == 2);
r = m.insert(m.cend(), P(1, 1));
assert(r == m.begin());
assert(m.size() == 2);
assert(r->first == 1);
assert(r->second == 1);
r = m.insert(m.cend(), P(3, 3));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3);
r = m.insert(m.cend(), P(3, 2));
assert(r == prev(m.end()));
assert(m.size() == 4);
assert(r->first == 3);
assert(r->second == 2);
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,85 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// template <class P>
// iterator insert(P&& p);
#include <map>
#include <cassert>
#include "../../../MoveOnly.h"
#include "min_allocator.h"
int main()
{
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
{
typedef std::multimap<int, MoveOnly> M;
typedef M::iterator R;
M m;
R r = m.insert(M::value_type(2, 2));
assert(r == m.begin());
assert(m.size() == 1);
assert(r->first == 2);
assert(r->second == 2);
r = m.insert(M::value_type(1, 1));
assert(r == m.begin());
assert(m.size() == 2);
assert(r->first == 1);
assert(r->second == 1);
r = m.insert(M::value_type(3, 3));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3);
r = m.insert(M::value_type(3, 3));
assert(r == prev(m.end()));
assert(m.size() == 4);
assert(r->first == 3);
assert(r->second == 3);
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, MoveOnly, std::less<int>, min_allocator<std::pair<const int, MoveOnly>>> M;
typedef M::iterator R;
M m;
R r = m.insert(M::value_type(2, 2));
assert(r == m.begin());
assert(m.size() == 1);
assert(r->first == 2);
assert(r->second == 2);
r = m.insert(M::value_type(1, 1));
assert(r == m.begin());
assert(m.size() == 2);
assert(r->first == 1);
assert(r->second == 1);
r = m.insert(M::value_type(3, 3));
assert(r == prev(m.end()));
assert(m.size() == 3);
assert(r->first == 3);
assert(r->second == 3);
r = m.insert(M::value_type(3, 3));
assert(r == prev(m.end()));
assert(m.size() == 4);
assert(r->first == 3);
assert(r->second == 3);
}
#endif
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
}

View File

@@ -0,0 +1,159 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// size_type count(const key_type& k) const;
#include <map>
#include <cassert>
#include "min_allocator.h"
#include "private_constructor.hpp"
int main()
{
typedef std::pair<const int, double> V;
{
typedef std::multimap<int, double> M;
{
typedef M::size_type R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.count(4);
assert(r == 0);
r = m.count(5);
assert(r == 3);
r = m.count(6);
assert(r == 0);
r = m.count(7);
assert(r == 3);
r = m.count(8);
assert(r == 0);
r = m.count(9);
assert(r == 3);
r = m.count(10);
assert(r == 0);
}
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
{
typedef M::size_type R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.count(4);
assert(r == 0);
r = m.count(5);
assert(r == 3);
r = m.count(6);
assert(r == 0);
r = m.count(7);
assert(r == 3);
r = m.count(8);
assert(r == 0);
r = m.count(9);
assert(r == 3);
r = m.count(10);
assert(r == 0);
}
}
#endif
#if _LIBCPP_STD_VER > 11
{
typedef std::multimap<int, double, std::less<>> M;
typedef M::size_type R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.count(4);
assert(r == 0);
r = m.count(5);
assert(r == 3);
r = m.count(6);
assert(r == 0);
r = m.count(7);
assert(r == 3);
r = m.count(8);
assert(r == 0);
r = m.count(9);
assert(r == 3);
r = m.count(10);
assert(r == 0);
}
{
typedef PrivateConstructor PC;
typedef std::multimap<PC, double, std::less<>> M;
typedef M::size_type R;
M m;
m.insert ( std::make_pair<PC, double> ( PC::make(5), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(5), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(5), 3 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 3 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 3 ));
R r = m.count(4);
assert(r == 0);
r = m.count(5);
assert(r == 3);
r = m.count(6);
assert(r == 0);
r = m.count(7);
assert(r == 3);
r = m.count(8);
assert(r == 0);
r = m.count(9);
assert(r == 3);
r = m.count(10);
assert(r == 0);
}
#endif
}

View File

@@ -0,0 +1,264 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// pair<iterator, iterator> equal_range(const key_type& k);
// pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
#include <map>
#include <cassert>
#include "min_allocator.h"
#include "private_constructor.hpp"
int main()
{
typedef std::pair<const int, double> V;
{
typedef std::multimap<int, double> M;
{
typedef std::pair<M::iterator, M::iterator> R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.equal_range(4);
assert(r.first == m.begin());
assert(r.second == m.begin());
r = m.equal_range(5);
assert(r.first == m.begin());
assert(r.second == next(m.begin(), 3));
r = m.equal_range(6);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(7);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(8);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(9);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 9));
r = m.equal_range(10);
assert(r.first == m.end());
assert(r.second == m.end());
}
{
typedef std::pair<M::const_iterator, M::const_iterator> R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.equal_range(4);
assert(r.first == m.begin());
assert(r.second == m.begin());
r = m.equal_range(5);
assert(r.first == m.begin());
assert(r.second == next(m.begin(), 3));
r = m.equal_range(6);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(7);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(8);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(9);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 9));
r = m.equal_range(10);
assert(r.first == m.end());
assert(r.second == m.end());
}
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
{
typedef std::pair<M::iterator, M::iterator> R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.equal_range(4);
assert(r.first == m.begin());
assert(r.second == m.begin());
r = m.equal_range(5);
assert(r.first == m.begin());
assert(r.second == next(m.begin(), 3));
r = m.equal_range(6);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(7);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(8);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(9);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 9));
r = m.equal_range(10);
assert(r.first == m.end());
assert(r.second == m.end());
}
{
typedef std::pair<M::const_iterator, M::const_iterator> R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.equal_range(4);
assert(r.first == m.begin());
assert(r.second == m.begin());
r = m.equal_range(5);
assert(r.first == m.begin());
assert(r.second == next(m.begin(), 3));
r = m.equal_range(6);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(7);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(8);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(9);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 9));
r = m.equal_range(10);
assert(r.first == m.end());
assert(r.second == m.end());
}
}
#endif
#if _LIBCPP_STD_VER > 11
{
typedef std::pair<const int, double> V;
typedef std::multimap<int, double, std::less<>> M;
typedef std::pair<M::iterator, M::iterator> R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.equal_range(4);
assert(r.first == m.begin());
assert(r.second == m.begin());
r = m.equal_range(5);
assert(r.first == m.begin());
assert(r.second == next(m.begin(), 3));
r = m.equal_range(6);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(7);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(8);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(9);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 9));
r = m.equal_range(10);
assert(r.first == m.end());
assert(r.second == m.end());
}
{
typedef PrivateConstructor PC;
typedef std::multimap<PC, double, std::less<>> M;
typedef std::pair<M::iterator, M::iterator> R;
M m;
m.insert ( std::make_pair<PC, double> ( PC::make(5), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(5), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(5), 3 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 3 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 3 ));
// assert(m.size() == 9);
R r = m.equal_range(4);
assert(r.first == m.begin());
assert(r.second == m.begin());
r = m.equal_range(5);
assert(r.first == m.begin());
assert(r.second == next(m.begin(), 3));
r = m.equal_range(6);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 3));
r = m.equal_range(7);
assert(r.first == next(m.begin(), 3));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(8);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 6));
r = m.equal_range(9);
assert(r.first == next(m.begin(), 6));
assert(r.second == next(m.begin(), 9));
r = m.equal_range(10);
assert(r.first == m.end());
assert(r.second == m.end());
}
#endif
}

View File

@@ -0,0 +1,209 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// iterator find(const key_type& k);
// const_iterator find(const key_type& k) const;
#include <map>
#include <cassert>
#include "min_allocator.h"
#include "private_constructor.hpp"
int main()
{
typedef std::pair<const int, double> V;
{
typedef std::multimap<int, double> M;
{
typedef M::iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.find(5);
assert(r == m.begin());
r = m.find(6);
assert(r == m.end());
r = m.find(7);
assert(r == next(m.begin(), 3));
r = m.find(8);
assert(r == m.end());
r = m.find(9);
assert(r == next(m.begin(), 6));
r = m.find(10);
assert(r == m.end());
}
{
typedef M::const_iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.find(5);
assert(r == m.begin());
r = m.find(6);
assert(r == m.end());
r = m.find(7);
assert(r == next(m.begin(), 3));
r = m.find(8);
assert(r == m.end());
r = m.find(9);
assert(r == next(m.begin(), 6));
r = m.find(10);
assert(r == m.end());
}
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
{
typedef M::iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.find(5);
assert(r == m.begin());
r = m.find(6);
assert(r == m.end());
r = m.find(7);
assert(r == next(m.begin(), 3));
r = m.find(8);
assert(r == m.end());
r = m.find(9);
assert(r == next(m.begin(), 6));
r = m.find(10);
assert(r == m.end());
}
{
typedef M::const_iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.find(5);
assert(r == m.begin());
r = m.find(6);
assert(r == m.end());
r = m.find(7);
assert(r == next(m.begin(), 3));
r = m.find(8);
assert(r == m.end());
r = m.find(9);
assert(r == next(m.begin(), 6));
r = m.find(10);
assert(r == m.end());
}
}
#endif
#if _LIBCPP_STD_VER > 11
{
typedef std::pair<const int, double> V;
typedef std::multimap<int, double, std::less<>> M;
typedef M::iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.find(5);
assert(r == m.begin());
r = m.find(6);
assert(r == m.end());
r = m.find(7);
assert(r == next(m.begin(), 3));
r = m.find(8);
assert(r == m.end());
r = m.find(9);
assert(r == next(m.begin(), 6));
r = m.find(10);
assert(r == m.end());
}
{
typedef PrivateConstructor PC;
typedef std::multimap<PC, double, std::less<>> M;
typedef M::iterator R;
M m;
m.insert ( std::make_pair<PC, double> ( PC::make(5), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(5), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(5), 3 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 3 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 3 ));
R r = m.find(5);
assert(r == m.begin());
r = m.find(6);
assert(r == m.end());
r = m.find(7);
assert(r == next(m.begin(), 3));
r = m.find(8);
assert(r == m.end());
r = m.find(9);
assert(r == next(m.begin(), 6));
r = m.find(10);
assert(r == m.end());
}
#endif
}

View File

@@ -0,0 +1,221 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// iterator lower_bound(const key_type& k);
// const_iterator lower_bound(const key_type& k) const;
#include <map>
#include <cassert>
#include "min_allocator.h"
#include "private_constructor.hpp"
int main()
{
typedef std::pair<const int, double> V;
{
typedef std::multimap<int, double> M;
{
typedef M::iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.lower_bound(4);
assert(r == m.begin());
r = m.lower_bound(5);
assert(r == m.begin());
r = m.lower_bound(6);
assert(r == next(m.begin(), 3));
r = m.lower_bound(7);
assert(r == next(m.begin(), 3));
r = m.lower_bound(8);
assert(r == next(m.begin(), 6));
r = m.lower_bound(9);
assert(r == next(m.begin(), 6));
r = m.lower_bound(10);
assert(r == m.end());
}
{
typedef M::const_iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.lower_bound(4);
assert(r == m.begin());
r = m.lower_bound(5);
assert(r == m.begin());
r = m.lower_bound(6);
assert(r == next(m.begin(), 3));
r = m.lower_bound(7);
assert(r == next(m.begin(), 3));
r = m.lower_bound(8);
assert(r == next(m.begin(), 6));
r = m.lower_bound(9);
assert(r == next(m.begin(), 6));
r = m.lower_bound(10);
assert(r == m.end());
}
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
{
typedef M::iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.lower_bound(4);
assert(r == m.begin());
r = m.lower_bound(5);
assert(r == m.begin());
r = m.lower_bound(6);
assert(r == next(m.begin(), 3));
r = m.lower_bound(7);
assert(r == next(m.begin(), 3));
r = m.lower_bound(8);
assert(r == next(m.begin(), 6));
r = m.lower_bound(9);
assert(r == next(m.begin(), 6));
r = m.lower_bound(10);
assert(r == m.end());
}
{
typedef M::const_iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.lower_bound(4);
assert(r == m.begin());
r = m.lower_bound(5);
assert(r == m.begin());
r = m.lower_bound(6);
assert(r == next(m.begin(), 3));
r = m.lower_bound(7);
assert(r == next(m.begin(), 3));
r = m.lower_bound(8);
assert(r == next(m.begin(), 6));
r = m.lower_bound(9);
assert(r == next(m.begin(), 6));
r = m.lower_bound(10);
assert(r == m.end());
}
}
#endif
#if _LIBCPP_STD_VER > 11
{
typedef std::pair<const int, double> V;
typedef std::multimap<int, double, std::less<>> M;
typedef M::iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.lower_bound(4);
assert(r == m.begin());
r = m.lower_bound(5);
assert(r == m.begin());
r = m.lower_bound(6);
assert(r == next(m.begin(), 3));
r = m.lower_bound(7);
assert(r == next(m.begin(), 3));
r = m.lower_bound(8);
assert(r == next(m.begin(), 6));
r = m.lower_bound(9);
assert(r == next(m.begin(), 6));
r = m.lower_bound(10);
assert(r == m.end());
}
{
typedef PrivateConstructor PC;
typedef std::multimap<PC, double, std::less<>> M;
typedef M::iterator R;
M m;
m.insert ( std::make_pair<PC, double> ( PC::make(5), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(5), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(5), 3 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 3 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 3 ));
R r = m.lower_bound(4);
assert(r == m.begin());
r = m.lower_bound(5);
assert(r == m.begin());
r = m.lower_bound(6);
assert(r == next(m.begin(), 3));
r = m.lower_bound(7);
assert(r == next(m.begin(), 3));
r = m.lower_bound(8);
assert(r == next(m.begin(), 6));
r = m.lower_bound(9);
assert(r == next(m.begin(), 6));
r = m.lower_bound(10);
assert(r == m.end());
}
#endif
}

View File

@@ -0,0 +1,221 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// iterator upper_bound(const key_type& k);
// const_iterator upper_bound(const key_type& k) const;
#include <map>
#include <cassert>
#include "min_allocator.h"
#include "private_constructor.hpp"
int main()
{
typedef std::pair<const int, double> V;
{
typedef std::multimap<int, double> M;
{
typedef M::iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.upper_bound(4);
assert(r == m.begin());
r = m.upper_bound(5);
assert(r == next(m.begin(), 3));
r = m.upper_bound(6);
assert(r == next(m.begin(), 3));
r = m.upper_bound(7);
assert(r == next(m.begin(), 6));
r = m.upper_bound(8);
assert(r == next(m.begin(), 6));
r = m.upper_bound(9);
assert(r == next(m.begin(), 9));
r = m.upper_bound(10);
assert(r == m.end());
}
{
typedef M::const_iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.upper_bound(4);
assert(r == m.begin());
r = m.upper_bound(5);
assert(r == next(m.begin(), 3));
r = m.upper_bound(6);
assert(r == next(m.begin(), 3));
r = m.upper_bound(7);
assert(r == next(m.begin(), 6));
r = m.upper_bound(8);
assert(r == next(m.begin(), 6));
r = m.upper_bound(9);
assert(r == next(m.begin(), 9));
r = m.upper_bound(10);
assert(r == m.end());
}
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
{
typedef M::iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.upper_bound(4);
assert(r == m.begin());
r = m.upper_bound(5);
assert(r == next(m.begin(), 3));
r = m.upper_bound(6);
assert(r == next(m.begin(), 3));
r = m.upper_bound(7);
assert(r == next(m.begin(), 6));
r = m.upper_bound(8);
assert(r == next(m.begin(), 6));
r = m.upper_bound(9);
assert(r == next(m.begin(), 9));
r = m.upper_bound(10);
assert(r == m.end());
}
{
typedef M::const_iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.upper_bound(4);
assert(r == m.begin());
r = m.upper_bound(5);
assert(r == next(m.begin(), 3));
r = m.upper_bound(6);
assert(r == next(m.begin(), 3));
r = m.upper_bound(7);
assert(r == next(m.begin(), 6));
r = m.upper_bound(8);
assert(r == next(m.begin(), 6));
r = m.upper_bound(9);
assert(r == next(m.begin(), 9));
r = m.upper_bound(10);
assert(r == m.end());
}
}
#endif
#if _LIBCPP_STD_VER > 11
{
typedef std::pair<const int, double> V;
typedef std::multimap<int, double, std::less<>> M;
typedef M::iterator R;
V ar[] =
{
V(5, 1),
V(5, 2),
V(5, 3),
V(7, 1),
V(7, 2),
V(7, 3),
V(9, 1),
V(9, 2),
V(9, 3)
};
M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
R r = m.upper_bound(4);
assert(r == m.begin());
r = m.upper_bound(5);
assert(r == next(m.begin(), 3));
r = m.upper_bound(6);
assert(r == next(m.begin(), 3));
r = m.upper_bound(7);
assert(r == next(m.begin(), 6));
r = m.upper_bound(8);
assert(r == next(m.begin(), 6));
r = m.upper_bound(9);
assert(r == next(m.begin(), 9));
r = m.upper_bound(10);
assert(r == m.end());
}
{
typedef PrivateConstructor PC;
typedef std::multimap<PC, double, std::less<>> M;
typedef M::iterator R;
M m;
m.insert ( std::make_pair<PC, double> ( PC::make(5), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(5), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(5), 3 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(7), 3 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 1 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 2 ));
m.insert ( std::make_pair<PC, double> ( PC::make(9), 3 ));
R r = m.upper_bound(4);
assert(r == m.begin());
r = m.upper_bound(5);
assert(r == next(m.begin(), 3));
r = m.upper_bound(6);
assert(r == next(m.begin(), 3));
r = m.upper_bound(7);
assert(r == next(m.begin(), 6));
r = m.upper_bound(8);
assert(r == next(m.begin(), 6));
r = m.upper_bound(9);
assert(r == next(m.begin(), 9));
r = m.upper_bound(10);
assert(r == m.end());
}
#endif
}

View File

@@ -0,0 +1,200 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// void swap(multimap& m);
#include <map>
#include <cassert>
#include "min_allocator.h"
int main()
{
typedef std::pair<const int, double> V;
{
typedef std::multimap<int, double> M;
{
V ar1[] =
{
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
{
V ar1[] =
{
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
m1.swap(m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
}
#endif
}

View File

@@ -0,0 +1,305 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <map>
// class multimap
// template <class Key, class T, class Compare, class Allocator>
// void
// swap(multimap<Key, T, Compare, Allocator>& x, multimap<Key, T, Compare, Allocator>& y);
#include <map>
#include <cassert>
#include "test_allocator.h"
#include "../../../test_compare.h"
#include "min_allocator.h"
int main()
{
typedef std::pair<const int, double> V;
{
typedef std::multimap<int, double> M;
{
V ar1[] =
{
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
typedef test_allocator<V> A;
typedef test_compare<std::less<int> > C;
typedef std::multimap<int, double, C, A> M;
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]), C(1), A(1));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]), C(2), A(2));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
assert(m1.key_comp() == C(2));
assert(m1.get_allocator() == A(1));
assert(m2.key_comp() == C(1));
assert(m2.get_allocator() == A(2));
}
{
typedef other_allocator<V> A;
typedef test_compare<std::less<int> > C;
typedef std::multimap<int, double, C, A> M;
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]), C(1), A(1));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]), C(2), A(2));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
assert(m1.key_comp() == C(2));
assert(m1.get_allocator() == A(2));
assert(m2.key_comp() == C(1));
assert(m2.get_allocator() == A(1));
}
}
#if __cplusplus >= 201103L
{
typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
{
V ar1[] =
{
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
}
{
typedef min_allocator<V> A;
typedef test_compare<std::less<int> > C;
typedef std::multimap<int, double, C, A> M;
V ar1[] =
{
V(1, 1),
V(2, 2),
V(3, 3),
V(4, 4)
};
V ar2[] =
{
V(5, 5),
V(6, 6),
V(7, 7),
V(8, 8),
V(9, 9),
V(10, 10),
V(11, 11),
V(12, 12)
};
M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]), C(1), A());
M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]), C(2), A());
M m1_save = m1;
M m2_save = m2;
swap(m1, m2);
assert(m1 == m2_save);
assert(m2 == m1_save);
assert(m1.key_comp() == C(2));
assert(m1.get_allocator() == A());
assert(m2.key_comp() == C(1));
assert(m2.get_allocator() == A());
}
}
#endif
}

Some files were not shown because too many files have changed in this diff Show More