avoid creating default initialised values if key doesn't exist

This commit is contained in:
Artem Pavlenko 2011-10-27 18:02:55 +01:00 committed by Dane Springmeyer
parent 896bcbd211
commit 49f0df0f7f
3 changed files with 42 additions and 4 deletions

View file

@ -25,10 +25,15 @@
#ifndef MAPNIK_ATTRIBUTE_HPP
#define MAPNIK_ATTRIBUTE_HPP
// mapnik
#include <mapnik/value.hpp>
// stl
#include <string>
namespace mapnik {
static mapnik::value _null_value;
struct attribute
{
std::string name_;
@ -36,9 +41,15 @@ struct attribute
: name_(name) {}
template <typename V ,typename F>
V value(F const& f) const
V const& value(F const& f) const
{
return f[name_];
typedef typename F::const_iterator const_iterator;
const_iterator itr = f.find(name_);
if (itr != f.end())
{
return itr->second;
}
return _null_value;
}
std::string const& name() const { return name_;}
};

View file

@ -66,6 +66,7 @@ private:
std::map<std::string,value> props_;
public:
typedef std::map<std::string,value>::iterator iterator;
typedef std::map<std::string,value>::const_iterator const_iterator;
explicit feature(int id)
: properties(props_),
id_(id),
@ -146,7 +147,7 @@ public:
{
return props_;
}
iterator begin()
{
return props_.begin();
@ -156,7 +157,22 @@ public:
{
return props_.end();
}
const_iterator begin() const
{
return props_.begin();
}
const_iterator end() const
{
return props_.end();
}
const_iterator find(std::string const& key) const
{
return props_.find(key);
}
std::string to_string() const
{
std::stringstream ss;

View file

@ -47,11 +47,22 @@ struct placement;
class metawriter_property_map
{
public:
typedef std::map<std::string, UnicodeString> property_map;
typedef property_map::const_iterator const_iterator;
metawriter_property_map() {}
UnicodeString const& operator[](std::string const& key) const;
UnicodeString& operator[](std::string const& key) {return m_[key];}
std::map<std::string, UnicodeString>::const_iterator find(std::string const& key) const
{
return m_.find(key);
}
std::map<std::string, UnicodeString>::const_iterator end() const
{
return m_.end();
}
private:
std::map<std::string, UnicodeString> m_;
property_map m_;
UnicodeString not_found_;
};