41 #ifndef EPETRAEXT_DIRECTORY_H
42 #define EPETRAEXT_DIRECTORY_H
53 #include <EpetraExt_Functors.h>
60 template <
typename KT,
typename DT,
class DH,
class AC,
class MG>
66 typedef typename std::map< KT, Teuchos::RCP<DT> >
DataMap;
70 typedef typename std::multimap< KT, Teuchos::RCP<DT> >
DataRecvMap;
139 template <
typename T>
153 : size_( static_cast<double>(size) )
158 int slen = in.length();
160 for(
int i = 0; i < slen; ++i )
161 sum += static_cast<int>( in[i] );
163 return static_cast<int>( fmod( static_cast<float>( sum ), size_ ) );
170 template <
typename T,
typename U >
173 typedef typename std::multimap< typename T::value_type, typename U::value_type> UTMultiMap;
177 typename T::iterator iterT = firstContainer.begin();
178 typename T::iterator endT = firstContainer.end();
179 typename U::iterator iterU = secondContainer.begin();
180 typename U::iterator endU = secondContainer.end();
182 for( ; (iterT!=endT)||(iterU!=endU) ; ++iterT, ++iterU )
183 SortMap.insert(
typename UTMultiMap::value_type( *iterT, *iterU ) );
185 firstContainer.clear();
186 secondContainer.clear();
188 typename UTMultiMap::iterator iterUTM = SortMap.begin();
189 typename UTMultiMap::iterator endUTM = SortMap.end();
191 for( ; iterUTM != endUTM; ++iterUTM )
193 firstContainer.push_back( iterUTM->first );
194 secondContainer.push_back( iterUTM->second );
201 template <
typename T >
204 if( container.size() < 2 )
return true;
206 typename T::iterator iterT = container.begin();
207 typename T::iterator endT = container.end();
208 typename T::iterator iterTPlus = iterT;
211 for( ; iterTPlus != endT; ++iterT, ++iterTPlus )
212 if( !(*iterT<*iterTPlus) )
return false;
217 template <
typename KT,
typename DT,
class DH,
class AC,
class MG>
226 pushData_( entries, newEntries, procs );
238 for( ; citDM != cendDM; ++citDM )
239 container_.insert( *citDM );
242 template <
typename KT,
typename DT,
class DH,
class AC,
class MG>
251 pushKeys_( keys, newKeys, procs );
263 for( ; citKL != cendKL; ++citKL )
264 container_.erase( *citKL );
267 template <
typename KT,
typename DT,
class DH,
class AC,
class MG>
278 pushKeys_( keys, newKeys, procs );
285 for( ; citKL != cendKL; ++citKL )
287 if( !container_.count( *citKL ) )
288 throw "Data not in directory: " + *citKL +
"\n";
290 newEntries[*citKL] = (container_.lower_bound( *citKL ))->second;
293 migrate_.rvs( procs, newKeys, newEntries, entries );
299 for( ; citKL != cendKL; ++citKL )
301 if( !container_.count( *citKL ) )
302 throw "Data not in directory: " + *citKL +
"\n";
304 entries[*citKL] = (container_.lower_bound( *citKL ))->second;
312 template <
typename KT,
typename DT,
class DH,
class AC,
class MG>
323 for( ; itKL != endKL; ++itKL )
324 procs.push_back( distHash_(*itKL) );
328 migrate_( procs, sKeys, rKeys );
331 template <
typename KT,
typename DT,
class DH,
class AC,
class MG>
342 for( ; itDM != endDM; ++itDM )
343 procs.push_back( distHash_(itDM->first) );
345 migrate_( procs, sData, rData );
void pushKeys_(KeyList &, KeyList &, ProcList &)
AC::const_iterator ContainerCIter
std::multimap< KT, Teuchos::RCP< DT > > DataRecvMap
KeyList::iterator KeyListIter
DataRecvMap::const_iterator DataRecvMapCIter
DataRecvMap::iterator DataRecvMapIter
ProcKeyList::iterator ProcKeyListIter
bool operator==(const Directory &) const
DataMap::iterator DataMapIter
bool operator!=(const Directory &) const
Directory(MG migrate, DH distHash)
int operator()(const T &in)
std::vector< ProcKeyPair > ProcKeyList
void SortContainer2(T &firstContainer, U &secondContainer)
Sorts a given container: deal with a problem with some STL impl.
Directory & operator=(const Directory &)
DataMap::const_iterator DataMapCIter
std::map< KT, Teuchos::RCP< DT > > DataMap
std::vector< int > ProcList
ProcList::iterator ProcListIter
std::vector< KT > KeyList
void pushData_(DataMap const &, DataRecvMap &, ProcList &)
std::pair< int, KT > ProcKeyPair
bool IsSorted(T &container)
Checks if data in a container is sorted.
AC::iterator ContainerIter
void addEntries(DataMap const &entries)
void getEntries(KeyList &keys, DataMap &entries)
void deleteEntries(KeyList &keys)
KeyList::const_iterator KeyListCIter
int operator()(const std::string &in)
Distributed Directory Tool.