7 #ifndef SPACE_HASH_NATIVE_H 
    8 #define SPACE_HASH_NATIVE_H 
   10 #include <argos3/core/simulator/space/space_hash.h> 
   18    template <
class Element, 
class Updater>
 
   74          SBucketData* ElementList;
 
   97          inline bool Empty()
 const {
 
   98             return (ElementList == NULL);
 
  105          inline void Clear() {
 
  107                SBucketData* psCur = ElementList;
 
  108                SBucketData* psNext = psCur->Next;
 
  112                   if(psCur) psNext = psCur->Next;
 
  125          inline void Add(Element& c_element,
 
  129             if(Empty()) ElementList = 
new SBucketData(c_element, n_i, n_j, n_k);
 
  130             else ElementList = 
new SBucketData(c_element, n_i, n_j, n_k, ElementList);
 
  140          bool Exists(
const Element& c_element,
 
  144             SBucketData* psCur = ElementList;
 
  146                if(psCur->Elem == &c_element &&
 
  149                   psCur->K == n_k) 
return true;
 
  168          m_unCurrentStoreTimestamp(0) {}
 
  175          delete[] m_psBuckets;
 
  182          for(
size_t i = 0; i < CSpaceHash<Element,Updater>::GetSize(); ++i) {
 
  183             m_psBuckets[i].Clear();
 
  205          m_unCurrentStoreTimestamp++;
 
  220                                      Element& c_element) {
 
  224          SBucket& sBucket = m_psBuckets[nHash];
 
  226          if(sBucket.StoreTimestamp == m_unCurrentStoreTimestamp) {
 
  228             if(! sBucket.Exists(c_element, n_i, n_j, n_k)) {
 
  229                sBucket.Add(c_element, n_i, n_j, n_k);
 
  236             sBucket.StoreTimestamp = m_unCurrentStoreTimestamp;
 
  238             sBucket.Add(c_element, n_i, n_j, n_k);
 
  254          bool bNewElements = 
false;
 
  258          SBucket& sBucket = m_psBuckets[nHash];
 
  263          if((sBucket.StoreTimestamp == m_unCurrentStoreTimestamp) && 
 
  268                 psCur = psCur->
Next) {
 
  270                if(n_i == psCur->I &&
 
  275                   t_elements.insert(psCur->Elem);
 
  283          for(
size_t i = 0; i < CSpaceHash<Element,Updater>::GetSize(); ++i) {
 
  284             if((m_psBuckets[i].StoreTimestamp == m_unCurrentStoreTimestamp) &&
 
  285                !m_psBuckets[i].Empty()) {
 
  286                c_os << 
"BUCKET " << i << std::endl;
 
  289                    psCur = psCur->Next) {
 
  291                        << psCur->Elem->GetId()
 
  310       SBucket* m_psBuckets;
 
  319       UInt64 m_unCurrentStoreTimestamp;
 
signed int SInt32
32-bit signed integer.
 
unsigned long long UInt64
64-bit unsigned integer.
 
The namespace containing all the ARGoS related code.
 
virtual void SetSize(size_t un_size)
Sets the size of the space hash.
 
size_t GetSize()
Returns the size of the space hash.
 
UInt32 CoordinateHash(SInt32 n_i, SInt32 n_j, SInt32 n_k)
Calculates the hash of a space hash coordinate.
 
Defines the basic space hash.
 
virtual void Update()
Updates the entire space hash.
 
A space hash implementation that does not rely on std::map or std::tr1:unordered_map.
 
virtual void SetSize(size_t un_size)
Sets the size of the space hash.
 
CSpaceHashNative()
Class constructor.
 
~CSpaceHashNative()
Class destructor.
 
virtual void Update()
Updates the entire space hash.
 
virtual void Dump(CARGoSLog &c_os)
 
virtual bool CheckCell(SInt32 n_i, SInt32 n_j, SInt32 n_k, typename CSpaceHash< Element, Updater >::TElementList &t_elements)
Looks for elements to process in a cell.
 
virtual void UpdateCell(SInt32 n_i, SInt32 n_j, SInt32 n_k, Element &c_element)
Adds an element to a cell of the space hash.
 
void Clear()
Empties all the buckets in the space hash.
 
An item of data held by each bucket.
 
SBucketData * Next
Pointer to the next data item in the list, or NULL if this is the last.
 
Element * Elem
The element indexed by this data item.
 
SInt32 I
The space hash cell coordinate corresponding to this data item.
 
SBucketData(Element &c_element, SInt32 n_i, SInt32 n_j, SInt32 n_k, SBucketData *ps_next=NULL)
Struct constructor.