diff options
Diffstat (limited to 'boost/property_map/dynamic_property_map.hpp')
-rw-r--r-- | boost/property_map/dynamic_property_map.hpp | 63 |
1 files changed, 22 insertions, 41 deletions
diff --git a/boost/property_map/dynamic_property_map.hpp b/boost/property_map/dynamic_property_map.hpp index f1fde81fb5..f5f4230e22 100644 --- a/boost/property_map/dynamic_property_map.hpp +++ b/boost/property_map/dynamic_property_map.hpp @@ -117,6 +117,15 @@ struct dynamic_const_put_error : public dynamic_property_exception { namespace detail { +// Trying to work around VC++ problem that seems to relate to having too many +// functions named "get" +template <typename PMap, typename Key> +typename boost::property_traits<PMap>::reference +get_wrapper_xxx(const PMap& pmap, const Key& key) { + using boost::get; + return get(pmap, key); +} + // // dynamic_property_map_adaptor - // property-map adaptor to support runtime polymorphism. @@ -135,32 +144,18 @@ class dynamic_property_map_adaptor : public dynamic_property_map // can be converted to value_type via iostreams. void do_put(const any& in_key, const any& in_value, mpl::bool_<true>) { -#if !(defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ == 95)) using boost::put; -#endif key_type key = any_cast<key_type>(in_key); if (in_value.type() == typeid(value_type)) { -#if defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ == 95) - boost::put(property_map, key, any_cast<value_type>(in_value)); -#else - put(property_map, key, any_cast<value_type>(in_value)); -#endif + put(property_map_, key, any_cast<value_type>(in_value)); } else { // if in_value is an empty string, put a default constructed value_type. std::string v = any_cast<std::string>(in_value); if (v.empty()) { -#if defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ == 95) - boost::put(property_map, key, value_type()); -#else - put(property_map, key, value_type()); -#endif + put(property_map_, key, value_type()); } else { -#if defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ == 95) - boost::put(property_map, key, detail::read_value<value_type>(v)); -#else - put(property_map, key, detail::read_value<value_type>(v)); -#endif + put(property_map_, key, detail::read_value<value_type>(v)); } } } @@ -171,33 +166,19 @@ class dynamic_property_map_adaptor : public dynamic_property_map } public: - explicit dynamic_property_map_adaptor(const PropertyMap& property_map) - : property_map(property_map) { } + explicit dynamic_property_map_adaptor(const PropertyMap& property_map_) + : property_map_(property_map_) { } virtual boost::any get(const any& key) { -#if defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ == 95) - return boost::get(property_map, any_cast<key_type>(key)); -#else - using boost::get; - - return get(property_map, any_cast<key_type>(key)); -#endif + return get_wrapper_xxx(property_map_, any_cast<typename boost::property_traits<PropertyMap>::key_type>(key)); } virtual std::string get_string(const any& key) { -#if defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ == 95) - std::ostringstream out; - out << boost::get(property_map, any_cast<key_type>(key)); - return out.str(); -#else - using boost::get; - std::ostringstream out; - out << get(property_map, any_cast<key_type>(key)); + out << get_wrapper_xxx(property_map_, any_cast<typename boost::property_traits<PropertyMap>::key_type>(key)); return out.str(); -#endif } virtual void put(const any& in_key, const any& in_value) @@ -210,11 +191,11 @@ public: virtual const std::type_info& key() const { return typeid(key_type); } virtual const std::type_info& value() const { return typeid(value_type); } - PropertyMap& base() { return property_map; } - const PropertyMap& base() const { return property_map; } + PropertyMap& base() { return property_map_; } + const PropertyMap& base() const { return property_map_; } private: - PropertyMap property_map; + PropertyMap property_map_; }; } // namespace detail @@ -243,11 +224,11 @@ public: template<typename PropertyMap> dynamic_properties& - property(const std::string& name, PropertyMap property_map) + property(const std::string& name, PropertyMap property_map_) { - // Tbd: exception safety boost::shared_ptr<dynamic_property_map> pm( - new detail::dynamic_property_map_adaptor<PropertyMap>(property_map)); + boost::static_pointer_cast<dynamic_property_map>( + boost::make_shared<detail::dynamic_property_map_adaptor<PropertyMap> >(property_map_))); property_maps.insert(property_maps_type::value_type(name, pm)); return *this; |