/* -*- C++ -*- * * This file is a part of LEMON, a generic C++ optimization library * * Copyright (C) 2003-2008 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport * (Egervary Research Group on Combinatorial Optimization, EGRES). * * Permission to use, modify and distribute this software is granted * provided that this copyright notice appears in all copies. For * precise terms see the accompanying LICENSE file. * * This software is provided "AS IS" with no warranty of any kind, * express or implied, and with no claim as to its suitability for any * purpose. * */ #ifndef LEMON_MAPS_H #define LEMON_MAPS_H #include #include #include #include #include ///\file ///\ingroup maps ///\brief Miscellaneous property maps #include namespace lemon { /// \addtogroup maps /// @{ /// Base class of maps. /// Base class of maps. It provides the necessary type definitions /// required by the map %concepts. template class MapBase { public: /// \biref The key type of the map. typedef K Key; /// \brief The value type of the map. /// (The type of objects associated with the keys). typedef V Value; }; /// Null map. (a.k.a. DoNothingMap) /// This map can be used if you have to provide a map only for /// its type definitions, or if you have to provide a writable map, /// but data written to it is not required (i.e. it will be sent to /// /dev/null). /// It conforms the \ref concepts::ReadWriteMap "ReadWriteMap" concept. /// /// \sa ConstMap template class NullMap : public MapBase { public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Gives back a default constructed element. Value operator[](const Key&) const { return Value(); } /// Absorbs the value. void set(const Key&, const Value&) {} }; /// Returns a \ref NullMap class /// This function just returns a \ref NullMap class. /// \relates NullMap template NullMap nullMap() { return NullMap(); } /// Constant map. /// This \ref concepts::ReadMap "readable map" assigns a specified /// value to each key. /// /// In other aspects it is equivalent to \ref NullMap. /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap" /// concept, but it absorbs the data written to it. /// /// The simplest way of using this map is through the constMap() /// function. /// /// \sa NullMap /// \sa IdentityMap template class ConstMap : public MapBase { private: V _value; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Default constructor /// Default constructor. /// The value of the map will be default constructed. ConstMap() {} /// Constructor with specified initial value /// Constructor with specified initial value. /// \param v is the initial value of the map. ConstMap(const Value &v) : _value(v) {} /// Gives back the specified value. Value operator[](const Key&) const { return _value; } /// Absorbs the value. void set(const Key&, const Value&) {} /// Sets the value that is assigned to each key. void setAll(const Value &v) { _value = v; } template ConstMap(const ConstMap &, const Value &v) : _value(v) {} }; /// Returns a \ref ConstMap class /// This function just returns a \ref ConstMap class. /// \relates ConstMap template inline ConstMap constMap(const V &v) { return ConstMap(v); } template struct Const {}; /// Constant map with inlined constant value. /// This \ref concepts::ReadMap "readable map" assigns a specified /// value to each key. /// /// In other aspects it is equivalent to \ref NullMap. /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap" /// concept, but it absorbs the data written to it. /// /// The simplest way of using this map is through the constMap() /// function. /// /// \sa NullMap /// \sa IdentityMap template class ConstMap > : public MapBase { public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor. ConstMap() {} /// Gives back the specified value. Value operator[](const Key&) const { return v; } /// Absorbs the value. void set(const Key&, const Value&) {} }; /// Returns a \ref ConstMap class with inlined constant value /// This function just returns a \ref ConstMap class with inlined /// constant value. /// \relates ConstMap template inline ConstMap > constMap() { return ConstMap >(); } /// Identity map. /// This \ref concepts::ReadMap "read-only map" gives back the given /// key as value without any modification. /// /// \sa ConstMap template class IdentityMap : public MapBase { public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Gives back the given value without any modification. Value operator[](const Key &k) const { return k; } }; /// Returns an \ref IdentityMap class /// This function just returns an \ref IdentityMap class. /// \relates IdentityMap template inline IdentityMap identityMap() { return IdentityMap(); } /// \brief Map for storing values for integer keys from the range /// [0..size-1]. /// /// This map is essentially a wrapper for \c std::vector. It assigns /// values to integer keys from the range [0..size-1]. /// It can be used with some data structures, for example /// \ref UnionFind, \ref BinHeap, when the used items are small /// integers. This map conforms the \ref concepts::ReferenceMap /// "ReferenceMap" concept. /// /// The simplest way of using this map is through the rangeMap() /// function. template class RangeMap : public MapBase { template friend class RangeMap; private: typedef std::vector Vector; Vector _vector; public: typedef MapBase Parent; /// Key type typedef typename Parent::Key Key; /// Value type typedef typename Parent::Value Value; /// Reference type typedef typename Vector::reference Reference; /// Const reference type typedef typename Vector::const_reference ConstReference; typedef True ReferenceMapTag; public: /// Constructor with specified default value. RangeMap(int size = 0, const Value &value = Value()) : _vector(size, value) {} /// Constructs the map from an appropriate \c std::vector. template RangeMap(const std::vector& vector) : _vector(vector.begin(), vector.end()) {} /// Constructs the map from another \ref RangeMap. template RangeMap(const RangeMap &c) : _vector(c._vector.begin(), c._vector.end()) {} /// Returns the size of the map. int size() { return _vector.size(); } /// Resizes the map. /// Resizes the underlying \c std::vector container, so changes the /// keyset of the map. /// \param size The new size of the map. The new keyset will be the /// range [0..size-1]. /// \param value The default value to assign to the new keys. void resize(int size, const Value &value = Value()) { _vector.resize(size, value); } private: RangeMap& operator=(const RangeMap&); public: ///\e Reference operator[](const Key &k) { return _vector[k]; } ///\e ConstReference operator[](const Key &k) const { return _vector[k]; } ///\e void set(const Key &k, const Value &v) { _vector[k] = v; } }; /// Returns a \ref RangeMap class /// This function just returns a \ref RangeMap class. /// \relates RangeMap template inline RangeMap rangeMap(int size = 0, const V &value = V()) { return RangeMap(size, value); } /// \brief Returns a \ref RangeMap class created from an appropriate /// \c std::vector /// This function just returns a \ref RangeMap class created from an /// appropriate \c std::vector. /// \relates RangeMap template inline RangeMap rangeMap(const std::vector &vector) { return RangeMap(vector); } /// Map type based on \c std::map /// This map is essentially a wrapper for \c std::map with addition /// that you can specify a default value for the keys that are not /// stored actually. This value can be different from the default /// contructed value (i.e. \c %Value()). /// This type conforms the \ref concepts::ReferenceMap "ReferenceMap" /// concept. /// /// This map is useful if a default value should be assigned to most of /// the keys and different values should be assigned only to a few /// keys (i.e. the map is "sparse"). /// The name of this type also refers to this important usage. /// /// Apart form that this map can be used in many other cases since it /// is based on \c std::map, which is a general associative container. /// However keep in mind that it is usually not as efficient as other /// maps. /// /// The simplest way of using this map is through the sparseMap() /// function. template > class SparseMap : public MapBase { template friend class SparseMap; public: typedef MapBase Parent; /// Key type typedef typename Parent::Key Key; /// Value type typedef typename Parent::Value Value; /// Reference type typedef Value& Reference; /// Const reference type typedef const Value& ConstReference; typedef True ReferenceMapTag; private: typedef std::map Map; Map _map; Value _value; public: /// \brief Constructor with specified default value. SparseMap(const Value &value = Value()) : _value(value) {} /// \brief Constructs the map from an appropriate \c std::map, and /// explicitly specifies a default value. template SparseMap(const std::map &map, const Value &value = Value()) : _map(map.begin(), map.end()), _value(value) {} /// \brief Constructs the map from another \ref SparseMap. template SparseMap(const SparseMap &c) : _map(c._map.begin(), c._map.end()), _value(c._value) {} private: SparseMap& operator=(const SparseMap&); public: ///\e Reference operator[](const Key &k) { typename Map::iterator it = _map.lower_bound(k); if (it != _map.end() && !_map.key_comp()(k, it->first)) return it->second; else return _map.insert(it, std::make_pair(k, _value))->second; } ///\e ConstReference operator[](const Key &k) const { typename Map::const_iterator it = _map.find(k); if (it != _map.end()) return it->second; else return _value; } ///\e void set(const Key &k, const Value &v) { typename Map::iterator it = _map.lower_bound(k); if (it != _map.end() && !_map.key_comp()(k, it->first)) it->second = v; else _map.insert(it, std::make_pair(k, v)); } ///\e void setAll(const Value &v) { _value = v; _map.clear(); } }; /// Returns a \ref SparseMap class /// This function just returns a \ref SparseMap class with specified /// default value. /// \relates SparseMap template inline SparseMap sparseMap(const V& value = V()) { return SparseMap(value); } template inline SparseMap > sparseMap(const V& value = V()) { return SparseMap >(value); } /// \brief Returns a \ref SparseMap class created from an appropriate /// \c std::map /// This function just returns a \ref SparseMap class created from an /// appropriate \c std::map. /// \relates SparseMap template inline SparseMap sparseMap(const std::map &map, const V& value = V()) { return SparseMap(map, value); } /// @} /// \addtogroup map_adaptors /// @{ /// Composition of two maps /// This \ref concepts::ReadMap "read-only map" returns the /// composition of two given maps. That is to say, if \c m1 is of /// type \c M1 and \c m2 is of \c M2, then for /// \code /// ComposeMap cm(m1,m2); /// \endcode /// cm[x] will be equal to m1[m2[x]]. /// /// The \c Key type of the map is inherited from \c M2 and the /// \c Value type is from \c M1. /// \c M2::Value must be convertible to \c M1::Key. /// /// The simplest way of using this map is through the composeMap() /// function. /// /// \sa CombineMap /// /// \todo Check the requirements. template class ComposeMap : public MapBase { const M1 &_m1; const M2 &_m2; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor ComposeMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {} /// \e typename MapTraits::ConstReturnValue operator[](const Key &k) const { return _m1[_m2[k]]; } }; /// Returns a \ref ComposeMap class /// This function just returns a \ref ComposeMap class. /// /// If \c m1 and \c m2 are maps and the \c Value type of \c m2 is /// convertible to the \c Key of \c m1, then composeMap(m1,m2)[x] /// will be equal to m1[m2[x]]. /// /// \relates ComposeMap template inline ComposeMap composeMap(const M1 &m1, const M2 &m2) { return ComposeMap(m1, m2); } /// Combination of two maps using an STL (binary) functor. /// This \ref concepts::ReadMap "read-only map" takes two maps and a /// binary functor and returns the combination of the two given maps /// using the functor. /// That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2 /// and \c f is of \c F, then for /// \code /// CombineMap cm(m1,m2,f); /// \endcode /// cm[x] will be equal to f(m1[x],m2[x]). /// /// The \c Key type of the map is inherited from \c M1 (\c M1::Key /// must be convertible to \c M2::Key) and the \c Value type is \c V. /// \c M2::Value and \c M1::Value must be convertible to the /// corresponding input parameter of \c F and the return type of \c F /// must be convertible to \c V. /// /// The simplest way of using this map is through the combineMap() /// function. /// /// \sa ComposeMap /// /// \todo Check the requirements. template class CombineMap : public MapBase { const M1 &_m1; const M2 &_m2; F _f; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor CombineMap(const M1 &m1, const M2 &m2, const F &f = F()) : _m1(m1), _m2(m2), _f(f) {} /// \e Value operator[](const Key &k) const { return _f(_m1[k],_m2[k]); } }; /// Returns a \ref CombineMap class /// This function just returns a \ref CombineMap class. /// /// For example, if \c m1 and \c m2 are both maps with \c double /// values, then /// \code /// combineMap(m1,m2,std::plus()) /// \endcode /// is equivalent to /// \code /// addMap(m1,m2) /// \endcode /// /// This function is specialized for adaptable binary function /// classes and C++ functions. /// /// \relates CombineMap template inline CombineMap combineMap(const M1 &m1, const M2 &m2, const F &f) { return CombineMap(m1,m2,f); } template inline CombineMap combineMap(const M1 &m1, const M2 &m2, const F &f) { return combineMap(m1,m2,f); } template inline CombineMap combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) { return combineMap(m1,m2,f); } /// Converts an STL style (unary) functor to a map /// This \ref concepts::ReadMap "read-only map" returns the value /// of a given functor. Actually, it just wraps the functor and /// provides the \c Key and \c Value typedefs. /// /// Template parameters \c K and \c V will become its \c Key and /// \c Value. In most cases they have to be given explicitly because /// a functor typically does not provide \c argument_type and /// \c result_type typedefs. /// Parameter \c F is the type of the used functor. /// /// The simplest way of using this map is through the functorToMap() /// function. /// /// \sa MapToFunctor template class FunctorToMap : public MapBase { const F &_f; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor FunctorToMap(const F &f = F()) : _f(f) {} /// \e Value operator[](const Key &k) const { return _f(k); } }; /// Returns a \ref FunctorToMap class /// This function just returns a \ref FunctorToMap class. /// /// This function is specialized for adaptable binary function /// classes and C++ functions. /// /// \relates FunctorToMap template inline FunctorToMap functorToMap(const F &f) { return FunctorToMap(f); } template inline FunctorToMap functorToMap(const F &f) { return FunctorToMap(f); } template inline FunctorToMap functorToMap(V (*f)(K)) { return FunctorToMap(f); } /// Converts a map to an STL style (unary) functor /// This class converts a map to an STL style (unary) functor. /// That is it provides an operator() to read its values. /// /// For the sake of convenience it also works as a usual /// \ref concepts::ReadMap "readable map", i.e. operator[] /// and the \c Key and \c Value typedefs also exist. /// /// The simplest way of using this map is through the mapToFunctor() /// function. /// ///\sa FunctorToMap template class MapToFunctor : public MapBase { const M &_m; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; typedef typename Parent::Key argument_type; typedef typename Parent::Value result_type; /// Constructor MapToFunctor(const M &m) : _m(m) {} /// \e Value operator()(const Key &k) const { return _m[k]; } /// \e Value operator[](const Key &k) const { return _m[k]; } }; /// Returns a \ref MapToFunctor class /// This function just returns a \ref MapToFunctor class. /// \relates MapToFunctor template inline MapToFunctor mapToFunctor(const M &m) { return MapToFunctor(m); } /// \brief Map adaptor to convert the \c Value type of a map to /// another type using the default conversion. /// Map adaptor to convert the \c Value type of a \ref concepts::ReadMap /// "readable map" to another type using the default conversion. /// The \c Key type of it is inherited from \c M and the \c Value /// type is \c V. /// This type conforms the \ref concepts::ReadMap "ReadMap" concept. /// /// The simplest way of using this map is through the convertMap() /// function. template class ConvertMap : public MapBase { const M &_m; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor /// Constructor. /// \param m The underlying map. ConvertMap(const M &m) : _m(m) {} /// \e Value operator[](const Key &k) const { return _m[k]; } }; /// Returns a \ref ConvertMap class /// This function just returns a \ref ConvertMap class. /// \relates ConvertMap template inline ConvertMap convertMap(const M &map) { return ConvertMap(map); } /// Applies all map setting operations to two maps /// This map has two \ref concepts::WriteMap "writable map" parameters /// and each write request will be passed to both of them. /// If \c M1 is also \ref concepts::ReadMap "readable", then the read /// operations will return the corresponding values of \c M1. /// /// The \c Key and \c Value types are inherited from \c M1. /// The \c Key and \c Value of \c M2 must be convertible from those /// of \c M1. /// /// The simplest way of using this map is through the forkMap() /// function. template class ForkMap : public MapBase { M1 &_m1; M2 &_m2; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor ForkMap(M1 &m1, M2 &m2) : _m1(m1), _m2(m2) {} /// Returns the value associated with the given key in the first map. Value operator[](const Key &k) const { return _m1[k]; } /// Sets the value associated with the given key in both maps. void set(const Key &k, const Value &v) { _m1.set(k,v); _m2.set(k,v); } }; /// Returns a \ref ForkMap class /// This function just returns a \ref ForkMap class. /// \relates ForkMap template inline ForkMap forkMap(M1 &m1, M2 &m2) { return ForkMap(m1,m2); } /// Sum of two maps /// This \ref concepts::ReadMap "read-only map" returns the sum /// of the values of the two given maps. /// Its \c Key and \c Value types are inherited from \c M1. /// The \c Key and \c Value of \c M2 must be convertible to those of /// \c M1. /// /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for /// \code /// AddMap am(m1,m2); /// \endcode /// am[x] will be equal to m1[x]+m2[x]. /// /// The simplest way of using this map is through the addMap() /// function. /// /// \sa SubMap, MulMap, DivMap /// \sa ShiftMap, ShiftWriteMap template class AddMap : public MapBase { const M1 &_m1; const M2 &_m2; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor AddMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {} /// \e Value operator[](const Key &k) const { return _m1[k]+_m2[k]; } }; /// Returns an \ref AddMap class /// This function just returns an \ref AddMap class. /// /// For example, if \c m1 and \c m2 are both maps with \c double /// values, then addMap(m1,m2)[x] will be equal to /// m1[x]+m2[x]. /// /// \relates AddMap template inline AddMap addMap(const M1 &m1, const M2 &m2) { return AddMap(m1,m2); } /// Difference of two maps /// This \ref concepts::ReadMap "read-only map" returns the difference /// of the values of the two given maps. /// Its \c Key and \c Value types are inherited from \c M1. /// The \c Key and \c Value of \c M2 must be convertible to those of /// \c M1. /// /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for /// \code /// SubMap sm(m1,m2); /// \endcode /// sm[x] will be equal to m1[x]-m2[x]. /// /// The simplest way of using this map is through the subMap() /// function. /// /// \sa AddMap, MulMap, DivMap template class SubMap : public MapBase { const M1 &_m1; const M2 &_m2; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor SubMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {} /// \e Value operator[](const Key &k) const { return _m1[k]-_m2[k]; } }; /// Returns a \ref SubMap class /// This function just returns a \ref SubMap class. /// /// For example, if \c m1 and \c m2 are both maps with \c double /// values, then subMap(m1,m2)[x] will be equal to /// m1[x]-m2[x]. /// /// \relates SubMap template inline SubMap subMap(const M1 &m1, const M2 &m2) { return SubMap(m1,m2); } /// Product of two maps /// This \ref concepts::ReadMap "read-only map" returns the product /// of the values of the two given maps. /// Its \c Key and \c Value types are inherited from \c M1. /// The \c Key and \c Value of \c M2 must be convertible to those of /// \c M1. /// /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for /// \code /// MulMap mm(m1,m2); /// \endcode /// mm[x] will be equal to m1[x]*m2[x]. /// /// The simplest way of using this map is through the mulMap() /// function. /// /// \sa AddMap, SubMap, DivMap /// \sa ScaleMap, ScaleWriteMap template class MulMap : public MapBase { const M1 &_m1; const M2 &_m2; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor MulMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {} /// \e Value operator[](const Key &k) const { return _m1[k]*_m2[k]; } }; /// Returns a \ref MulMap class /// This function just returns a \ref MulMap class. /// /// For example, if \c m1 and \c m2 are both maps with \c double /// values, then mulMap(m1,m2)[x] will be equal to /// m1[x]*m2[x]. /// /// \relates MulMap template inline MulMap mulMap(const M1 &m1,const M2 &m2) { return MulMap(m1,m2); } /// Quotient of two maps /// This \ref concepts::ReadMap "read-only map" returns the quotient /// of the values of the two given maps. /// Its \c Key and \c Value types are inherited from \c M1. /// The \c Key and \c Value of \c M2 must be convertible to those of /// \c M1. /// /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for /// \code /// DivMap dm(m1,m2); /// \endcode /// dm[x] will be equal to m1[x]/m2[x]. /// /// The simplest way of using this map is through the divMap() /// function. /// /// \sa AddMap, SubMap, MulMap template class DivMap : public MapBase { const M1 &_m1; const M2 &_m2; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor DivMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {} /// \e Value operator[](const Key &k) const { return _m1[k]/_m2[k]; } }; /// Returns a \ref DivMap class /// This function just returns a \ref DivMap class. /// /// For example, if \c m1 and \c m2 are both maps with \c double /// values, then divMap(m1,m2)[x] will be equal to /// m1[x]/m2[x]. /// /// \relates DivMap template inline DivMap divMap(const M1 &m1,const M2 &m2) { return DivMap(m1,m2); } /// Shifts a map with a constant. /// This \ref concepts::ReadMap "read-only map" returns the sum of /// the given map and a constant value (i.e. it shifts the map with /// the constant). Its \c Key and \c Value are inherited from \c M. /// /// Actually, /// \code /// ShiftMap sh(m,v); /// \endcode /// is equivalent to /// \code /// ConstMap cm(v); /// AddMap > sh(m,cm); /// \endcode /// /// The simplest way of using this map is through the shiftMap() /// function. /// /// \sa ShiftWriteMap template class ShiftMap : public MapBase { const M &_m; C _v; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor /// Constructor. /// \param m The undelying map. /// \param v The constant value. ShiftMap(const M &m, const C &v) : _m(m), _v(v) {} /// \e Value operator[](const Key &k) const { return _m[k]+_v; } }; /// Shifts a map with a constant (read-write version). /// This \ref concepts::ReadWriteMap "read-write map" returns the sum /// of the given map and a constant value (i.e. it shifts the map with /// the constant). Its \c Key and \c Value are inherited from \c M. /// It makes also possible to write the map. /// /// The simplest way of using this map is through the shiftWriteMap() /// function. /// /// \sa ShiftMap template class ShiftWriteMap : public MapBase { M &_m; C _v; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor /// Constructor. /// \param m The undelying map. /// \param v The constant value. ShiftWriteMap(M &m, const C &v) : _m(m), _v(v) {} /// \e Value operator[](const Key &k) const { return _m[k]+_v; } /// \e void set(const Key &k, const Value &v) { _m.set(k, v-_v); } }; /// Returns a \ref ShiftMap class /// This function just returns a \ref ShiftMap class. /// /// For example, if \c m is a map with \c double values and \c v is /// \c double, then shiftMap(m,v)[x] will be equal to /// m[x]+v. /// /// \relates ShiftMap template inline ShiftMap shiftMap(const M &m, const C &v) { return ShiftMap(m,v); } /// Returns a \ref ShiftWriteMap class /// This function just returns a \ref ShiftWriteMap class. /// /// For example, if \c m is a map with \c double values and \c v is /// \c double, then shiftWriteMap(m,v)[x] will be equal to /// m[x]+v. /// Moreover it makes also possible to write the map. /// /// \relates ShiftWriteMap template inline ShiftWriteMap shiftWriteMap(M &m, const C &v) { return ShiftWriteMap(m,v); } /// Scales a map with a constant. /// This \ref concepts::ReadMap "read-only map" returns the value of /// the given map multiplied from the left side with a constant value. /// Its \c Key and \c Value are inherited from \c M. /// /// Actually, /// \code /// ScaleMap sc(m,v); /// \endcode /// is equivalent to /// \code /// ConstMap cm(v); /// MulMap, M> sc(cm,m); /// \endcode /// /// The simplest way of using this map is through the scaleMap() /// function. /// /// \sa ScaleWriteMap template class ScaleMap : public MapBase { const M &_m; C _v; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor /// Constructor. /// \param m The undelying map. /// \param v The constant value. ScaleMap(const M &m, const C &v) : _m(m), _v(v) {} /// \e Value operator[](const Key &k) const { return _v*_m[k]; } }; /// Scales a map with a constant (read-write version). /// This \ref concepts::ReadWriteMap "read-write map" returns the value of /// the given map multiplied from the left side with a constant value. /// Its \c Key and \c Value are inherited from \c M. /// It can also be used as write map if the \c / operator is defined /// between \c Value and \c C and the given multiplier is not zero. /// /// The simplest way of using this map is through the scaleWriteMap() /// function. /// /// \sa ScaleMap template class ScaleWriteMap : public MapBase { M &_m; C _v; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor /// Constructor. /// \param m The undelying map. /// \param v The constant value. ScaleWriteMap(M &m, const C &v) : _m(m), _v(v) {} /// \e Value operator[](const Key &k) const { return _v*_m[k]; } /// \e void set(const Key &k, const Value &v) { _m.set(k, v/_v); } }; /// Returns a \ref ScaleMap class /// This function just returns a \ref ScaleMap class. /// /// For example, if \c m is a map with \c double values and \c v is /// \c double, then scaleMap(m,v)[x] will be equal to /// v*m[x]. /// /// \relates ScaleMap template inline ScaleMap scaleMap(const M &m, const C &v) { return ScaleMap(m,v); } /// Returns a \ref ScaleWriteMap class /// This function just returns a \ref ScaleWriteMap class. /// /// For example, if \c m is a map with \c double values and \c v is /// \c double, then scaleWriteMap(m,v)[x] will be equal to /// v*m[x]. /// Moreover it makes also possible to write the map. /// /// \relates ScaleWriteMap template inline ScaleWriteMap scaleWriteMap(M &m, const C &v) { return ScaleWriteMap(m,v); } /// Negative of a map /// This \ref concepts::ReadMap "read-only map" returns the negative /// of the values of the given map (using the unary \c - operator). /// Its \c Key and \c Value are inherited from \c M. /// /// If M::Value is \c int, \c double etc., then /// \code /// NegMap neg(m); /// \endcode /// is equivalent to /// \code /// ScaleMap neg(m,-1); /// \endcode /// /// The simplest way of using this map is through the negMap() /// function. /// /// \sa NegWriteMap template class NegMap : public MapBase { const M& _m; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor NegMap(const M &m) : _m(m) {} /// \e Value operator[](const Key &k) const { return -_m[k]; } }; /// Negative of a map (read-write version) /// This \ref concepts::ReadWriteMap "read-write map" returns the /// negative of the values of the given map (using the unary \c - /// operator). /// Its \c Key and \c Value are inherited from \c M. /// It makes also possible to write the map. /// /// If M::Value is \c int, \c double etc., then /// \code /// NegWriteMap neg(m); /// \endcode /// is equivalent to /// \code /// ScaleWriteMap neg(m,-1); /// \endcode /// /// The simplest way of using this map is through the negWriteMap() /// function. /// /// \sa NegMap template class NegWriteMap : public MapBase { M &_m; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor NegWriteMap(M &m) : _m(m) {} /// \e Value operator[](const Key &k) const { return -_m[k]; } /// \e void set(const Key &k, const Value &v) { _m.set(k, -v); } }; /// Returns a \ref NegMap class /// This function just returns a \ref NegMap class. /// /// For example, if \c m is a map with \c double values, then /// negMap(m)[x] will be equal to -m[x]. /// /// \relates NegMap template inline NegMap negMap(const M &m) { return NegMap(m); } /// Returns a \ref NegWriteMap class /// This function just returns a \ref NegWriteMap class. /// /// For example, if \c m is a map with \c double values, then /// negWriteMap(m)[x] will be equal to -m[x]. /// Moreover it makes also possible to write the map. /// /// \relates NegWriteMap template inline NegWriteMap negWriteMap(M &m) { return NegWriteMap(m); } /// Absolute value of a map /// This \ref concepts::ReadMap "read-only map" returns the absolute /// value of the values of the given map. /// Its \c Key and \c Value are inherited from \c M. /// \c Value must be comparable to \c 0 and the unary \c - /// operator must be defined for it, of course. /// /// The simplest way of using this map is through the absMap() /// function. template class AbsMap : public MapBase { const M &_m; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor AbsMap(const M &m) : _m(m) {} /// \e Value operator[](const Key &k) const { Value tmp = _m[k]; return tmp >= 0 ? tmp : -tmp; } }; /// Returns an \ref AbsMap class /// This function just returns an \ref AbsMap class. /// /// For example, if \c m is a map with \c double values, then /// absMap(m)[x] will be equal to m[x] if /// it is positive or zero and -m[x] if m[x] is /// negative. /// /// \relates AbsMap template inline AbsMap absMap(const M &m) { return AbsMap(m); } /// @} // Logical maps and map adaptors: /// \addtogroup maps /// @{ /// Constant \c true map. /// This \ref concepts::ReadMap "read-only map" assigns \c true to /// each key. /// /// Note that /// \code /// TrueMap tm; /// \endcode /// is equivalent to /// \code /// ConstMap tm(true); /// \endcode /// /// \sa FalseMap /// \sa ConstMap template class TrueMap : public MapBase { public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Gives back \c true. Value operator[](const Key&) const { return true; } }; /// Returns a \ref TrueMap class /// This function just returns a \ref TrueMap class. /// \relates TrueMap template inline TrueMap trueMap() { return TrueMap(); } /// Constant \c false map. /// This \ref concepts::ReadMap "read-only map" assigns \c false to /// each key. /// /// Note that /// \code /// FalseMap fm; /// \endcode /// is equivalent to /// \code /// ConstMap fm(false); /// \endcode /// /// \sa TrueMap /// \sa ConstMap template class FalseMap : public MapBase { public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Gives back \c false. Value operator[](const Key&) const { return false; } }; /// Returns a \ref FalseMap class /// This function just returns a \ref FalseMap class. /// \relates FalseMap template inline FalseMap falseMap() { return FalseMap(); } /// @} /// \addtogroup map_adaptors /// @{ /// Logical 'and' of two maps /// This \ref concepts::ReadMap "read-only map" returns the logical /// 'and' of the values of the two given maps. /// Its \c Key type is inherited from \c M1 and its \c Value type is /// \c bool. \c M2::Key must be convertible to \c M1::Key. /// /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for /// \code /// AndMap am(m1,m2); /// \endcode /// am[x] will be equal to m1[x]&&m2[x]. /// /// The simplest way of using this map is through the andMap() /// function. /// /// \sa OrMap /// \sa NotMap, NotWriteMap template class AndMap : public MapBase { const M1 &_m1; const M2 &_m2; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor AndMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {} /// \e Value operator[](const Key &k) const { return _m1[k]&&_m2[k]; } }; /// Returns an \ref AndMap class /// This function just returns an \ref AndMap class. /// /// For example, if \c m1 and \c m2 are both maps with \c bool values, /// then andMap(m1,m2)[x] will be equal to /// m1[x]&&m2[x]. /// /// \relates AndMap template inline AndMap andMap(const M1 &m1, const M2 &m2) { return AndMap(m1,m2); } /// Logical 'or' of two maps /// This \ref concepts::ReadMap "read-only map" returns the logical /// 'or' of the values of the two given maps. /// Its \c Key type is inherited from \c M1 and its \c Value type is /// \c bool. \c M2::Key must be convertible to \c M1::Key. /// /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for /// \code /// OrMap om(m1,m2); /// \endcode /// om[x] will be equal to m1[x]||m2[x]. /// /// The simplest way of using this map is through the orMap() /// function. /// /// \sa AndMap /// \sa NotMap, NotWriteMap template class OrMap : public MapBase { const M1 &_m1; const M2 &_m2; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor OrMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {} /// \e Value operator[](const Key &k) const { return _m1[k]||_m2[k]; } }; /// Returns an \ref OrMap class /// This function just returns an \ref OrMap class. /// /// For example, if \c m1 and \c m2 are both maps with \c bool values, /// then orMap(m1,m2)[x] will be equal to /// m1[x]||m2[x]. /// /// \relates OrMap template inline OrMap orMap(const M1 &m1, const M2 &m2) { return OrMap(m1,m2); } /// Logical 'not' of a map /// This \ref concepts::ReadMap "read-only map" returns the logical /// negation of the values of the given map. /// Its \c Key is inherited from \c M and its \c Value is \c bool. /// /// The simplest way of using this map is through the notMap() /// function. /// /// \sa NotWriteMap template class NotMap : public MapBase { const M &_m; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor NotMap(const M &m) : _m(m) {} /// \e Value operator[](const Key &k) const { return !_m[k]; } }; /// Logical 'not' of a map (read-write version) /// This \ref concepts::ReadWriteMap "read-write map" returns the /// logical negation of the values of the given map. /// Its \c Key is inherited from \c M and its \c Value is \c bool. /// It makes also possible to write the map. When a value is set, /// the opposite value is set to the original map. /// /// The simplest way of using this map is through the notWriteMap() /// function. /// /// \sa NotMap template class NotWriteMap : public MapBase { M &_m; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor NotWriteMap(M &m) : _m(m) {} /// \e Value operator[](const Key &k) const { return !_m[k]; } /// \e void set(const Key &k, bool v) { _m.set(k, !v); } }; /// Returns a \ref NotMap class /// This function just returns a \ref NotMap class. /// /// For example, if \c m is a map with \c bool values, then /// notMap(m)[x] will be equal to !m[x]. /// /// \relates NotMap template inline NotMap notMap(const M &m) { return NotMap(m); } /// Returns a \ref NotWriteMap class /// This function just returns a \ref NotWriteMap class. /// /// For example, if \c m is a map with \c bool values, then /// notWriteMap(m)[x] will be equal to !m[x]. /// Moreover it makes also possible to write the map. /// /// \relates NotWriteMap template inline NotWriteMap notWriteMap(M &m) { return NotWriteMap(m); } /// Combination of two maps using the \c == operator /// This \ref concepts::ReadMap "read-only map" assigns \c true to /// the keys for which the corresponding values of the two maps are /// equal. /// Its \c Key type is inherited from \c M1 and its \c Value type is /// \c bool. \c M2::Key must be convertible to \c M1::Key. /// /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for /// \code /// EqualMap em(m1,m2); /// \endcode /// em[x] will be equal to m1[x]==m2[x]. /// /// The simplest way of using this map is through the equalMap() /// function. /// /// \sa LessMap template class EqualMap : public MapBase { const M1 &_m1; const M2 &_m2; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {} /// \e Value operator[](const Key &k) const { return _m1[k]==_m2[k]; } }; /// Returns an \ref EqualMap class /// This function just returns an \ref EqualMap class. /// /// For example, if \c m1 and \c m2 are maps with keys and values of /// the same type, then equalMap(m1,m2)[x] will be equal to /// m1[x]==m2[x]. /// /// \relates EqualMap template inline EqualMap equalMap(const M1 &m1, const M2 &m2) { return EqualMap(m1,m2); } /// Combination of two maps using the \c < operator /// This \ref concepts::ReadMap "read-only map" assigns \c true to /// the keys for which the corresponding value of the first map is /// less then the value of the second map. /// Its \c Key type is inherited from \c M1 and its \c Value type is /// \c bool. \c M2::Key must be convertible to \c M1::Key. /// /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for /// \code /// LessMap lm(m1,m2); /// \endcode /// lm[x] will be equal to m1[x]. /// /// The simplest way of using this map is through the lessMap() /// function. /// /// \sa EqualMap template class LessMap : public MapBase { const M1 &_m1; const M2 &_m2; public: typedef MapBase Parent; typedef typename Parent::Key Key; typedef typename Parent::Value Value; /// Constructor LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {} /// \e Value operator[](const Key &k) const { return _m1[k]<_m2[k]; } }; /// Returns an \ref LessMap class /// This function just returns an \ref LessMap class. /// /// For example, if \c m1 and \c m2 are maps with keys and values of /// the same type, then lessMap(m1,m2)[x] will be equal to /// m1[x]. /// /// \relates LessMap template inline LessMap lessMap(const M1 &m1, const M2 &m2) { return LessMap(m1,m2); } /// @} } #endif // LEMON_MAPS_H