/* Boost.Flyweight test of assoc_container_factory. * * Copyright 2006-2018 Joaquin M Lopez Munoz. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) * * See http://www.boost.org/libs/flyweight for library home page. */ #include "test_assoc_cont_factory.hpp" #include /* keep it first to prevent nasty warns in MSVC */ #include #include #include #include #include #include #include #include #include #include "test_basic_template.hpp" using namespace boost::flyweights; struct reverse_set_specifier { template struct apply { typedef std::set > type; }; }; struct assoc_container_factory_flyweight_specifier1 { template struct apply { typedef flyweight< T, assoc_container_factory > type; }; }; /* flyweight<..., assoc_container_factory_class >, ...> pulls * the type std::set<...> in as part of its associated ADL set and causes it * to be instantiated when doing any unqualified function call like, for * instance, comparing flyweights for equality, which can trigger a static * assertion in concept-checked STL implementations when std::set<...> is an * MPL placeholder expression. We avoid this mess with protected_set<...>. */ struct protected_set_empty_base{}; template struct protected_set: boost::mpl::if_c< boost::flyweights::detail::is_placeholder_expression< protected_set >::value, protected_set_empty_base, std::set >::type {}; struct assoc_container_factory_flyweight_specifier2 { template struct apply { typedef flyweight< T, assoc_container_factory_class< protected_set< boost::mpl::_1, std::greater, std::allocator > > > type; }; }; void test_assoc_container_factory() { test_basic_template(); test_basic_template(); }