/* -*- 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_CONCEPT_MAPS_H #define LEMON_CONCEPT_MAPS_H #include #include ///\ingroup concept ///\file ///\brief The concept of maps. namespace lemon { namespace concepts { /// \addtogroup concept /// @{ /// Readable map concept /// Readable map concept. /// template class ReadMap { public: /// The key type of the map. typedef K Key; /// The value type of the map. (The type of objects associated with the keys). typedef T Value; /// Returns the value associated with the given key. Value operator[](const Key &) const { return *static_cast(0); } template struct Constraints { void constraints() { Value val = m[key]; val = m[key]; typename _ReadMap::Value own_val = m[own_key]; own_val = m[own_key]; ignore_unused_variable_warning(key); ignore_unused_variable_warning(val); ignore_unused_variable_warning(own_key); ignore_unused_variable_warning(own_val); } const Key& key; const typename _ReadMap::Key& own_key; const _ReadMap& m; }; }; /// Writable map concept /// Writable map concept. /// template class WriteMap { public: /// The key type of the map. typedef K Key; /// The value type of the map. (The type of objects associated with the keys). typedef T Value; /// Sets the value associated with the given key. void set(const Key &, const Value &) {} /// Default constructor. WriteMap() {} template struct Constraints { void constraints() { m.set(key, val); m.set(own_key, own_val); ignore_unused_variable_warning(key); ignore_unused_variable_warning(val); ignore_unused_variable_warning(own_key); ignore_unused_variable_warning(own_val); } const Key& key; const Value& val; const typename _WriteMap::Key& own_key; const typename _WriteMap::Value& own_val; _WriteMap& m; }; }; /// Read/writable map concept /// Read/writable map concept. /// template class ReadWriteMap : public ReadMap, public WriteMap { public: /// The key type of the map. typedef K Key; /// The value type of the map. (The type of objects associated with the keys). typedef T Value; /// Returns the value associated with the given key. Value operator[](const Key &) const { return *static_cast(0); } /// Sets the value associated with the given key. void set(const Key &, const Value &) {} template struct Constraints { void constraints() { checkConcept, _ReadWriteMap >(); checkConcept, _ReadWriteMap >(); } }; }; /// Dereferable map concept /// Dereferable map concept. /// template class ReferenceMap : public ReadWriteMap { public: /// Tag for reference maps. typedef True ReferenceMapTag; /// The key type of the map. typedef K Key; /// The value type of the map. (The type of objects associated with the keys). typedef T Value; /// The reference type of the map. typedef R Reference; /// The const reference type of the map. typedef CR ConstReference; public: /// Returns a reference to the value associated with the given key. Reference operator[](const Key &) { return *static_cast(0); } /// Returns a const reference to the value associated with the given key. ConstReference operator[](const Key &) const { return *static_cast(0); } /// Sets the value associated with the given key. void set(const Key &k,const Value &t) { operator[](k)=t; } template struct Constraints { void constraints() { checkConcept, _ReferenceMap >(); ref = m[key]; m[key] = val; m[key] = ref; m[key] = cref; own_ref = m[own_key]; m[own_key] = own_val; m[own_key] = own_ref; m[own_key] = own_cref; m[key] = m[own_key]; m[own_key] = m[key]; } const Key& key; Value& val; Reference ref; ConstReference cref; const typename _ReferenceMap::Key& own_key; typename _ReferenceMap::Value& own_val; typename _ReferenceMap::Reference own_ref; typename _ReferenceMap::ConstReference own_cref; _ReferenceMap& m; }; }; // @} } //namespace concepts } //namespace lemon #endif // LEMON_CONCEPT_MAPS_H