//---------------------------------------------------------------- // File and Version Information: // $Id: AstSTLKeyMap.cc,v 1.2 2006/06/30 11:24:22 steinke Exp $ // // Description: // Implementation of AstSTLKeyMap class. // // Author List: // Matthias Steinke // // Bertram Kopf (RUB) migrated to PandaRoot //--------------------------------------------------------------- //----------------------- // This Class's Header -- //----------------------- #include "AstSTLKeyMap.h" //------------- // C Headers -- //------------- extern "C" { } //--------------- // C++ Headers -- //--------------- #include #include #include //------------------------------- // Collaborating Class Headers -- //------------------------------- //----------------------------------------------------------------------- // Local Macros, Typedefs, Structures, Unions and Forward Declarations -- //----------------------------------------------------------------------- // ---------------------------------------- // -- Public Function Member Definitions -- // ---------------------------------------- //---------------- // Constructors -- //---------------- template AstSTLKeyMap::AstSTLKeyMap(unsigned (*hashFunction)(const T1&), size_t buckets) : std::map >(), _myHashFunction(hashFunction), _allT2(new std::vector), _hashSetT1(new std::set), _buckets(buckets) {} //-------------- // Destructor -- //-------------- template AstSTLKeyMap::~AstSTLKeyMap() { delete _allT2; delete _hashSetT1; } //------------- // Modifiers -- //------------- template void AstSTLKeyMap::append( const T1 &t1ref, T2* const & t2ref){ (*this)[t1ref].push_back(t2ref); _allT2->push_back(t2ref); _hashSetT1->insert(t1ref); } template bool AstSTLKeyMap::findIntersectionSet(const std::set &withThis, std::vector &returned) const{ // First construct a dummy hash set since the intersection function modifies self. std::set dummy; return findIntersectionSet(withThis, returned, dummy); } template bool AstSTLKeyMap::findIntersectionSet(const std::set &withThis, std::vector &returned, std::set &returnedSet) const{ std::set clone(withThis); returnedSet.clear(); typename std::set::iterator iter = clone.begin(); while(iter != clone.end()){ if (_hashSetT1->find(*iter) != _hashSetT1->end()) returnedSet.insert(*iter); ++iter; } clone = returnedSet; // returnedSet=clone.intersection(*_hashSetT1); if (returnedSet.size()==0) return false; iter = clone.begin(); while(iter != clone.end()){ std::vector contained; if (this->find(*iter) != AstSTLKeyMap::end()) { contained = this->find(*iter)->second; // RW Ordered Vector cannot append one of itself! for (size_t i=0; i bool AstSTLKeyMap::findIntersectionSet(const std::vector &vector, std::vector &returned) const{ std::set inputVector; for (size_t i= 0; i bool AstSTLKeyMap::findDifferenceSet(const std::set &withThis, std::vector &returned) const{ std::set dummy; return findDifferenceSet(withThis, returned, dummy); } template bool AstSTLKeyMap::findDifferenceSet(const std::set &withThis, std::vector &returned, std::set &returnedSet) const{ std::set clone(*_hashSetT1); typename std::set::iterator iter = withThis.begin(); while (iter != withThis.end()) { clone.erase(*iter); ++iter; } returnedSet = clone; // returnedSet = clone.difference(withThis); iter = clone.begin(); while(iter != clone.end()){ if ( this->find(*iter) != AstSTLKeyMap::end()) { std::vector contained = this->find(*iter)->second; for (size_t i=0; i bool AstSTLKeyMap::findDifferenceSet(const std::vector &vector, std::vector &returned) const{ std::set inputVector; for (size_t i= 0; i AstSTLKeyMap & AstSTLKeyMap::unionMap(const AstSTLKeyMap &withThis){ typename std::set::iterator iter = withThis._hashSetT1->begin(); while (iter != withThis._hashSetT1->end()) { if (_hashSetT1->find(*iter) == _hashSetT1->end()) _hashSetT1->insert(*iter); ++iter; } // _hashSetT1->Union(*(withThis._hashSetT1)); iter = _hashSetT1->begin(); while (iter != _hashSetT1->end()){ // Only add new contents. Do not want overwrites if (find(*iter) == AstSTLKeyMap::end()) { std::vector retVal; retVal = withThis.find(*iter)->second; (*this)[*iter] = retVal; } ++iter; } // It's more efficient to clear the T2 list and re-write it // than to remove specific objects. _allT2->clear(); typename std::map >::iterator iterator = AstSTLKeyMap::begin(); while (iterator != AstSTLKeyMap::end()) { std::vector addThese = iterator->second; for (size_t i= 0; ipush_back(addThese[i]); ++iterator; } return *this; } template AstSTLKeyMap & AstSTLKeyMap::intersectionMap(const AstSTLKeyMap &withThis){ std::set intersection; typename std::set::iterator iter = _hashSetT1->begin(); while(iter != _hashSetT1->end()){ if (withThis._hashSetT1->find(*iter) != withThis._hashSetT1->end()) intersection.insert(*iter); ++iter; } (*_hashSetT1) = intersection; // _hashSetT1->intersection(*(withThis._hashSetT1)); iter = _hashSetT1->begin(); while (iter != _hashSetT1->end()){ // Only add new contents. Do not want overwrites if (find(*iter) == AstSTLKeyMap::end()) { std::vector retVal; retVal = withThis.find(*iter)->second; (*this)[*iter] = retVal; } ++iter; } _allT2->clear(); typename std::map >::iterator iterator = AstSTLKeyMap::begin(); while (iterator != AstSTLKeyMap::end()) { std::vector addThese = iterator->second; for (size_t i= 0; ipush_back(addThese[i]); ++iterator; } return *this; } // ------------------------------------------- // -- Protected Function Member Definitions -- // ------------------------------------------- // ----------------------------------------- // -- Private Function Member Definitions -- // ----------------------------------------- // ----------------------------------- // -- Internal Function Definitions -- // -----------------------------------