📄 map.hpp
字号:
// file : Utility/hetero/map.hpp
// author : Boris Kolpackov <boris@kolpackov.net>
// copyright : Copyright (c) 2002-2003 Boris Kolpackov
// license : http://kolpackov.net/license.html
#ifndef UTILITY_HETERO_MAP_HPP
#define UTILITY_HETERO_MAP_HPP
#include <typeinfo>
#include <map>
namespace Utility
{
namespace hetero
{
template <typename Key>
class map
{
private:
struct ValueBase
{
virtual
~ValueBase () {}
};
template <typename T>
class Value : public ValueBase
{
public:
Value (T const& t)
: t_ (t)
{
}
T t_;
};
typedef
std::map<Key, ValueBase*>
ValueMap;
typedef
typename std::map<Key, ValueBase*>::value_type
ValueType;
public:
class Typing {};
template <typename T>
struct type
{
typedef std::pair <Key const, T> value_type;
};
template <typename First>
struct Pair
{
First first;
Pair ()
: first (),
second_ (0)
{
}
Pair (First const& k, ValueBase* v)
: first (k),
second_ (v)
{
}
template <typename T>
T&
second () throw (Typing)
{
Value<T>* v = dynamic_cast<Value<T>*> (second_);
if (v == 0) throw Typing ();
return v->t_;
}
template <typename T>
T const&
second () const throw (Typing)
{
Value<T>* v = dynamic_cast<Value<T>*> (second_);
if (v == 0) throw Typing ();
return v->t_;
}
private:
ValueBase* second_;
};
friend
class iterator
{
public:
iterator (typename ValueMap::iterator const& i)
: i_ (i)
{
}
public:
Pair<Key>&
operator* ()
{
current_ = Pair<Key> (i_->first, i_->second);
return current_;
}
Pair<Key>*
operator-> ()
{
current_ = Pair<Key> (i_->first, i_->second);
return ¤t_;
}
public:
bool
operator== (iterator const& other)
{
return i_ == other.i_;
}
bool
operator!= (iterator const& other)
{
return i_ != other.i_;
}
private:
typename ValueMap::iterator i_;
Pair<Key> current_;
};
friend
class const_iterator
{
public:
const_iterator (typename ValueMap::const_iterator const& i)
: i_ (i)
{
}
public:
Pair<Key> const&
operator* ()
{
current_ = Pair<Key> (i_->first, i_->second);
return current_;
}
Pair<Key> const*
operator-> ()
{
current_ = Pair<Key> (i_->first, i_->second);
return ¤t_;
}
public:
bool
operator== (const_iterator const& other)
{
return i_ == other.i_;
}
bool
operator!= (const_iterator const& other)
{
return i_ != other.i_;
}
private:
typename ValueMap::const_iterator i_;
Pair<Key> current_;
};
public:
iterator
begin ()
{
return iterator (map_.begin ());
}
const_iterator
begin () const
{
return const_iterator (map_.begin ());
}
iterator
end ()
{
return iterator (map_.end ());
}
const_iterator
end () const
{
return const_iterator (map_.end ());
}
public:
template <typename T>
bool
insert (std::pair <Key, T> const& x)
{
ValueType v (x.first, new Value<T> (x.second));
return map_.insert (v).second;
}
template <typename T>
bool
insert (Key const& k, T const& t)
{
ValueType v (k, new Value<T> (t));
return map_.insert (v).second;
}
public:
iterator
find (Key const& k)
{
return iterator (map_.find (k));
}
const_iterator
find (Key const& k) const
{
return const_iterator (map_.find (k));
}
private:
ValueMap map_;
};
}
}
#include "Utility/hetero/map.tpp"
#endif // UTILITY_HETERO_MAP_HPP
//map.hpp,v 1.1 2005/05/24 04:33:13 turkaye Exp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -