summaryrefslogtreecommitdiff
path: root/boost/property_map/dynamic_property_map.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/property_map/dynamic_property_map.hpp')
-rw-r--r--boost/property_map/dynamic_property_map.hpp63
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;