#ifndef __JTOOLS__JMULTIPAIR__ #define __JTOOLS__JMULTIPAIR__ #include "JTools/JMultiKey.hh" #include "JLang/JClass.hh" /** * \author mdejong */ namespace JTOOLS {} namespace JPP { using namespace JTOOLS; } namespace JTOOLS { /** * Multidimensional pair. * * This class reproduces the element of a multidimensional map. * The individual data members can be accessed as: *
   *           JMultiPair<3, key_type, mapped_type>  pair;
   *
   *           pair[[.second].second].first;
   *           pair[[.second].second].second;
   * 
*/ template class JMultiPair { public: typedef JKey_t key_type; typedef JValue_t value_type; typedef JMultiPair mapped_type; typedef typename JLANG::JClass::reference_type reference_type; typedef JMultiKey multikey_type; /** * Default constructor. */ JMultiPair() : first (), second() {} /** * Constructor. * The primary key is inserted at the start of the secondary keys. * * \param __first primary key * \param __second secondary keys and value */ JMultiPair(typename JClass ::argument_type __first, typename JClass::argument_type __second) : first (__first), second(__second) {} /** * Constructor. * The secondary key is appended to the end of the primary keys. * * \param __first primary keys and value * \param __second secondary key */ JMultiPair(typename JClass::argument_type __first, typename JClass ::argument_type __second) : first (__first.first), second(mapped_type(__first.second, __second)) {} /** * Constructor. * * \param key multidimensional key * \param value value */ JMultiPair(typename JClass::argument_type key, typename JClass ::argument_type value) : first (key.first), second(mapped_type(key.second, value)) {} /** * Get multidimensional key. * * \return multidimensional key */ multikey_type getKey() const { return multikey_type(this->first, this->second.getKey()); } /** * Get value. * * \return value */ reference_type getValue() { return this->second.getValue(); } /** * Get value. * * \return value */ const reference_type getValue() const { return this->second.getValue(); } key_type first; mapped_type second; }; /** * Two-dimensional pair. */ template class JMultiPair<2, JKey_t, JValue_t> { public: typedef JKey_t key_type; typedef JValue_t value_type; typedef JMultiPair<1, key_type, value_type> mapped_type; typedef typename JClass::reference_type reference_type; typedef JMultiKey<2, key_type> multikey_type; /** * Default constructor. */ JMultiPair() : first (), second() {} /** * Constructor. * The primary key is inserted at the start of the secondary key. * * \param __first primary key * \param __second secondary key and value */ JMultiPair(typename JClass ::argument_type __first, typename JClass::argument_type __second) : first (__first), second(__second) {} /** * Constructor. * The secondary key is appended to the end of the primary key. * * \param __first primary keys and value * \param __second secondary key */ JMultiPair(typename JClass::argument_type __first, typename JClass ::argument_type __second) : first (__first.first), second(mapped_type(__second, __first.second)) {} /** * Constructor. * * \param key multidimensional key * \param value value */ JMultiPair(typename JClass::argument_type key, typename JClass ::argument_type value) : first (key.first), second(mapped_type(key.second, value)) {} /** * Get multidimensional key. * * \return multidimensional key */ multikey_type getKey() const { return multikey_type(this->first, this->second.getKey()); } /** * Get value. * * \return value */ reference_type getValue() { return this->second.getValue(); } /** * Get value. * * \return value */ const reference_type getValue() const { return this->second.getValue(); } key_type first; mapped_type second; }; /** * One-dimensional pair. */ template class JMultiPair<1, JKey_t, JValue_t> { public: typedef JKey_t key_type; typedef JValue_t value_type; typedef JValue_t mapped_type; typedef typename JClass::reference_type reference_type; typedef JMultiKey<1, key_type> multikey_type; /** * Default constructor. */ JMultiPair() : first (), second() {} /** * Constructor. * * \param __first key * \param __second value */ JMultiPair(typename JClass ::argument_type __first, typename JClass::argument_type __second) : first (__first), second(__second) {} /** * Constructor. * * \param key multidimensional key * \param value value */ JMultiPair(typename JClass::argument_type key, typename JClass ::argument_type value) : first (key.first), second(value) {} /** * Get multidimensional key. * * \return multidimensional key */ multikey_type getKey() const { return JMultiKey<1, key_type>(this->first); } /** * Get value. * * \return value */ reference_type getValue() { return this->second; } /** * Get value. * * \return value */ const reference_type getValue() const { return this->second; } key_type first; mapped_type second; }; /** * Empty pair. */ template class JMultiPair<0, JKey_t, JValue_t> {}; } #endif