#ifndef __JTOOLS__JHASHMAPTOOLKIT__ #define __JTOOLS__JHASHMAPTOOLKIT__ #include #include "JTools/JHashMap.hh" /** * \file * * Arithmetic toolkit for hash maps. * \author mdejong */ namespace JTOOLS {} namespace JPP { using namespace JTOOLS; } namespace JTOOLS { /** * Toolkit for JHashMap. * * The various pointers to member functions refer to policy methods used in base class JMATH::JMath. */ struct JHashMapToolkit { /** * Reset buffer. * * \param buffer buffer */ template static void reset(JHashMap& buffer) { for (typename JHashMap::iterator i = buffer.begin(); i != buffer.end(); ++i) { i->second = JValue_t(); } } /** * Set values in target corresponding to keys in source. * * \param target target buffer * \param source source buffer * \param value value */ template static void set(JHashMap& target, const JHashMap& source, const JValue_t& value) { target.clear(); for (typename JHashMap::const_iterator i = source.begin(); i != source.end(); ++i) { target[i->first] = value; } } /** * Evaluate arithmetic operation on buffer. * * \param buffer buffer * \param f1 operation */ template static void evaluate(JHashMap& buffer, JValue_t& (JValue_t::*f1)()) { for (typename JHashMap::iterator i = buffer.begin(); i != buffer.end(); ++i) { (i->second.*f1)(); } } /** * Evaluate arithmetic operation on buffers. * * \param first first buffer * \param second second buffer * \param f1 operation */ template static void evaluate(JHashMap& first, const JHashMap& second, JValue_t& (JValue_t::*f1)(const JValue_t&)) { for (typename JHashMap::const_iterator i = second.begin(); i != second.end(); ++i) { (first[i->first].*f1)(i->second); } } /** * Evaluate arithmetic operation on buffer. * * \param buffer buffer * \param f1 operation * \param factor factor */ template static void evaluate(JHashMap& buffer, JValue_t& (JValue_t::*f1)(const double), const double factor) { for (typename JHashMap::iterator i = buffer.begin(); i != buffer.end(); ++i) { (i->second.*f1)(factor); } } /** * Check equality of buffers. * * \param first first buffer * \param second second buffer * \return true if buffers are equal; else false */ template static bool equals(const JHashMap& first, const JHashMap& second) { for (typename JHashMap::const_iterator p = first .begin(), q = second.begin(); ; ++p, ++q) { if (p != first.end() && q != second.end()) { if (p->first != q->first || p->second != q->second) { return false; } } else if (p == first.end() && q == second.end()) { return true; } else { return false; } } } /** * Check equality of buffers. * * \param first first buffer * \param second second buffer * \param precision precision * \return true if buffers are equal; else false */ template static bool equals(const JHashMap& first, const JHashMap& second, const double precision) { for (typename JHashMap::const_iterator p = first .begin(), q = second.begin(); ; ++p, ++q) { if (p != first.end() && q != second.end()) { if (p->first != q->first || !p->second.equals(q->second, precision)) { return false; } } else if (p == first.end() && q == second.end()) { return true; } else { return false; } } } }; } #endif