#include <boost/container/flat_map.hpp>
#include <boost/container/allocator.hpp>
#include <boost/container/detail/flat_tree.hpp>
+#include <boost/container/stable_vector.hpp>
+#include <boost/container/small_vector.hpp>
+#include <boost/container/deque.hpp>
+#include <boost/container/static_vector.hpp>
+#include <boost/container/detail/container_or_allocator_rebind.hpp>
#include "print_container.hpp"
#include "dummy_test_allocator.hpp"
#include "emplace_test.hpp"
#include "../../intrusive/test/iterator_test.hpp"
-#include <vector>
#include <map>
//Explicit instantiation to detect compilation errors
//flat_map
+typedef std::pair<test::movable_and_copyable_int, test::movable_and_copyable_int> test_pair_t;
template class flat_map
< test::movable_and_copyable_int
, test::movable_and_copyable_int
, std::less<test::movable_and_copyable_int>
- , test::simple_allocator
- < std::pair<test::movable_and_copyable_int, test::movable_and_copyable_int> >
+ , test::simple_allocator< test_pair_t >
>;
template class flat_map
< test::movable_and_copyable_int
, test::movable_and_copyable_int
, std::less<test::movable_and_copyable_int>
- , std::allocator
- < std::pair<test::movable_and_copyable_int, test::movable_and_copyable_int> >
+ , small_vector< test_pair_t, 10, std::allocator< test_pair_t > >
>;
-template class flat_map
+//flat_multimap
+template class flat_multimap
< test::movable_and_copyable_int
, test::movable_and_copyable_int
, std::less<test::movable_and_copyable_int>
- , allocator
- < std::pair<test::movable_and_copyable_int, test::movable_and_copyable_int> >
+ , stable_vector< test_pair_t, allocator< test_pair_t > >
+ >;
+
+template class flat_multimap
+ < test::movable_and_copyable_int
+ , test::movable_and_copyable_int
+ , std::less<test::movable_and_copyable_int>
+ , deque<test_pair_t, test::simple_allocator< test_pair_t > >
>;
-//flat_multimap
template class flat_multimap
< test::movable_and_copyable_int
, test::movable_and_copyable_int
, std::less<test::movable_and_copyable_int>
- , test::simple_allocator
- < std::pair<test::movable_and_copyable_int, test::movable_and_copyable_int> >
+ , static_vector<test_pair_t, 10 >
>;
//As flat container iterators are typedefs for vector::[const_]iterator,
}} //boost::container
+#if (__cplusplus > 201103L)
+#include <vector>
+
+namespace boost{
+namespace container{
+
+template class flat_map
+ < test::movable_and_copyable_int
+ , test::movable_and_copyable_int
+ , std::less<test::movable_and_copyable_int>
+ , std::vector<test_pair_t>
+>;
+
+}} //boost::container
+
+#endif
class recursive_flat_map
{
return true;
}
-}}}
+template< class RandomIt >
+void random_shuffle( RandomIt first, RandomIt last )
+{
+ typedef typename boost::container::iterator_traits<RandomIt>::difference_type difference_type;
+ difference_type n = last - first;
+ for (difference_type i = n-1; i > 0; --i) {
+ difference_type j = std::rand() % (i+1);
+ if(j != i) {
+ boost::adl_move_swap(first[i], first[j]);
+ }
+ }
+}
+
+bool flat_tree_extract_adopt_test()
+{
+ using namespace boost::container;
+ const std::size_t NumElements = 100;
+
+ //extract/adopt map
+ {
+ //Construction insertion
+ flat_map<int, int> fmap;
+
+ for(std::size_t i = 0; i != NumElements; ++i){
+ fmap.emplace(static_cast<int>(i), -static_cast<int>(i));
+ }
+
+ flat_map<int, int> fmap_copy(fmap);
+ flat_map<int, int>::sequence_type seq(fmap.extract_sequence());
+ if(!fmap.empty())
+ return false;
+ if(!CheckEqualContainers(seq, fmap_copy))
+ return false;
+
+ seq.insert(seq.end(), fmap_copy.begin(), fmap_copy.end());
+ boost::container::test::random_shuffle(seq.begin(), seq.end());
+ fmap.adopt_sequence(boost::move(seq));
+ if(!CheckEqualContainers(fmap, fmap_copy))
+ return false;
+ }
+
+ //extract/adopt map, ordered_unique_range
+ {
+ //Construction insertion
+ flat_map<int, int> fmap;
+
+ for(std::size_t i = 0; i != NumElements; ++i){
+ fmap.emplace(static_cast<int>(i), -static_cast<int>(i));
+ }
+
+ flat_map<int, int> fmap_copy(fmap);
+ flat_map<int, int>::sequence_type seq(fmap.extract_sequence());
+ if(!fmap.empty())
+ return false;
+ if(!CheckEqualContainers(seq, fmap_copy))
+ return false;
+
+ fmap.adopt_sequence(ordered_unique_range, boost::move(seq));
+ if(!CheckEqualContainers(fmap, fmap_copy))
+ return false;
+ }
+ //extract/adopt multimap
+ {
+ //Construction insertion
+ flat_multimap<int, int> fmmap;
-template<class VoidAllocator>
-struct GetAllocatorMap
+ for(std::size_t i = 0; i != NumElements; ++i){
+ fmmap.emplace(static_cast<int>(i), -static_cast<int>(i));
+ fmmap.emplace(static_cast<int>(i), -static_cast<int>(i));
+ }
+
+ flat_multimap<int, int> fmmap_copy(fmmap);
+ flat_multimap<int, int>::sequence_type seq(fmmap.extract_sequence());
+ if(!fmmap.empty())
+ return false;
+ if(!CheckEqualContainers(seq, fmmap_copy))
+ return false;
+
+ boost::container::test::random_shuffle(seq.begin(), seq.end());
+ fmmap.adopt_sequence(boost::move(seq));
+ if(!CheckEqualContainers(fmmap, fmmap_copy))
+ return false;
+ }
+
+ //extract/adopt multimap, ordered_range
+ {
+ //Construction insertion
+ flat_multimap<int, int> fmmap;
+
+ for(std::size_t i = 0; i != NumElements; ++i){
+ fmmap.emplace(static_cast<int>(i), -static_cast<int>(i));
+ fmmap.emplace(static_cast<int>(i), -static_cast<int>(i));
+ }
+
+ flat_multimap<int, int> fmmap_copy(fmmap);
+ flat_multimap<int, int>::sequence_type seq(fmmap.extract_sequence());
+ if(!fmmap.empty())
+ return false;
+ if(!CheckEqualContainers(seq, fmmap_copy))
+ return false;
+
+ fmmap.adopt_sequence(ordered_range, boost::move(seq));
+ if(!CheckEqualContainers(fmmap, fmmap_copy))
+ return false;
+ }
+
+ return true;
+}
+
+}}}
+
+template<class VoidAllocatorOrContainer>
+struct GetMapContainer
{
template<class ValueType>
struct apply
{
+ typedef std::pair<ValueType, ValueType> type_t;
typedef flat_map< ValueType
, ValueType
, std::less<ValueType>
- , typename allocator_traits<VoidAllocator>
- ::template portable_rebind_alloc< std::pair<ValueType, ValueType> >::type
+ , typename boost::container::container_detail::container_or_allocator_rebind<VoidAllocatorOrContainer, type_t>::type
> map_type;
typedef flat_multimap< ValueType
, ValueType
, std::less<ValueType>
- , typename allocator_traits<VoidAllocator>
- ::template portable_rebind_alloc< std::pair<ValueType, ValueType> >::type
+ , typename boost::container::container_detail::container_or_allocator_rebind<VoidAllocatorOrContainer, type_t>::type
> multimap_type;
};
};
}}} //namespace boost::container::test
-template<class VoidAllocator>
+template<class VoidAllocatorOrContainer>
int test_map_variants()
{
- typedef typename GetAllocatorMap<VoidAllocator>::template apply<int>::map_type MyMap;
- typedef typename GetAllocatorMap<VoidAllocator>::template apply<test::movable_int>::map_type MyMoveMap;
- typedef typename GetAllocatorMap<VoidAllocator>::template apply<test::movable_and_copyable_int>::map_type MyCopyMoveMap;
- typedef typename GetAllocatorMap<VoidAllocator>::template apply<test::copyable_int>::map_type MyCopyMap;
+ typedef typename GetMapContainer<VoidAllocatorOrContainer>::template apply<int>::map_type MyMap;
+ typedef typename GetMapContainer<VoidAllocatorOrContainer>::template apply<test::movable_int>::map_type MyMoveMap;
+ typedef typename GetMapContainer<VoidAllocatorOrContainer>::template apply<test::movable_and_copyable_int>::map_type MyCopyMoveMap;
+ typedef typename GetMapContainer<VoidAllocatorOrContainer>::template apply<test::copyable_int>::map_type MyCopyMap;
- typedef typename GetAllocatorMap<VoidAllocator>::template apply<int>::multimap_type MyMultiMap;
- typedef typename GetAllocatorMap<VoidAllocator>::template apply<test::movable_int>::multimap_type MyMoveMultiMap;
- typedef typename GetAllocatorMap<VoidAllocator>::template apply<test::movable_and_copyable_int>::multimap_type MyCopyMoveMultiMap;
- typedef typename GetAllocatorMap<VoidAllocator>::template apply<test::copyable_int>::multimap_type MyCopyMultiMap;
+ typedef typename GetMapContainer<VoidAllocatorOrContainer>::template apply<int>::multimap_type MyMultiMap;
+ typedef typename GetMapContainer<VoidAllocatorOrContainer>::template apply<test::movable_int>::multimap_type MyMoveMultiMap;
+ typedef typename GetMapContainer<VoidAllocatorOrContainer>::template apply<test::movable_and_copyable_int>::multimap_type MyCopyMoveMultiMap;
+ typedef typename GetMapContainer<VoidAllocatorOrContainer>::template apply<test::copyable_int>::multimap_type MyCopyMultiMap;
typedef std::map<int, int> MyStdMap;
typedef std::multimap<int, int> MyStdMultiMap;
return 1;
}
+ ////////////////////////////////////
+ // Extract/Adopt test
+ ////////////////////////////////////
+ if(!flat_tree_extract_adopt_test()){
+ return 1;
+ }
+
+ if (!boost::container::test::instantiate_constructors<flat_map<int, int>, flat_multimap<int, int> >())
+ return 1;
+
////////////////////////////////////
// Testing allocator implementations
////////////////////////////////////