Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
/*
 *  See header file for a description of this class.
 *
 *  \author Paolo Ronchese INFN Padova
 *
 */

template <class Key, class Content>
DTBufferTree<Key, Content>::DTBufferTree() : bufferContent(DTBufferTreeTrait<Content>::getDefault()) {}

template <class Key, class Content>
DTBufferTree<Key, Content>::~DTBufferTree() {
  map_iter iter = bufferMap.begin();
  map_iter iend = bufferMap.end();
  while (iter != iend)
    delete (iter++)->second;
}

template <class Key, class Content>
void DTBufferTree<Key, Content>::clear() {
  map_iter iter = bufferMap.begin();
  map_iter iend = bufferMap.end();
  while (iter != iend)
    delete (iter++)->second;
  bufferMap.clear();
  bufferContent = std::move(Content(DTBufferTreeTrait<Content>::getDefault()));
}

template <class Key, class Content>
int DTBufferTree<Key, Content>::insert(ElementKey fKey, ElementKey lKey, Content cont) {
  if (fKey == lKey) {
    bufferContent = std::move(cont);
    return 1;
  }
  map_iter iter = bufferMap.find(*fKey);
  if (iter != bufferMap.end())
    return iter->second->insert(++fKey, lKey, std::move(cont));
  map_node* bMap = new map_node;
  bufferMap.insert(std::pair<Key, DTBufferTree<Key, Content>*>(*fKey, bMap));
  bMap->insert(++fKey, lKey, std::move(cont));
  return 0;
}

template <class Key, class Content>
int DTBufferTree<Key, Content>::insert(const Key& k, Content cont) {
  map_iter iter = bufferMap.find(k);
  if (iter != bufferMap.end()) {
    iter->second->bufferContent = std::move(cont);
    return 1;
  }
  map_node* bMap = new map_node;
  bufferMap.insert(std::pair<Key, DTBufferTree<Key, Content>*>(k, bMap));
  bMap->bufferContent = std::move(cont);
  return 0;
}

template <class Key, class Content>
int DTBufferTree<Key, Content>::find(ElementKey fKey,
                                     ElementKey lKey,
                                     typename DTBufferTreeTrait<Content>::outputTypeOfConstFind& cont) const {
  if (fKey == lKey) {
    cont = DTBufferTreeTrait<Content>::getOutputValue(bufferContent);
    return 0;
  }
  map_iter iter = bufferMap.find(*fKey++);
  if (iter != bufferMap.end())
    return iter->second->find(fKey, lKey, cont);
  cont = DTBufferTreeTrait<Content>::getDefault();
  return 1;
}

template <class Key, class Content>
int DTBufferTree<Key, Content>::find(const Key& k,
                                     typename DTBufferTreeTrait<Content>::outputTypeOfConstFind& cont) const {
  map_iter iter = bufferMap.find(k);
  if (iter != bufferMap.end()) {
    cont = DTBufferTreeTrait<Content>::getOutputValue(iter->second->bufferContent);
    return 0;
  }
  cont = DTBufferTreeTrait<Content>::getDefault();
  return 1;
}

template <class Key, class Content>
int DTBufferTree<Key, Content>::find(ElementKey fKey,
                                     ElementKey lKey,
                                     typename DTBufferTreeTrait<Content>::outputTypeOfNonConstFind& cont) {
  if (fKey == lKey) {
    cont = DTBufferTreeTrait<Content>::getOutputValue(bufferContent);
    return 0;
  }
  map_iter iter = bufferMap.find(*fKey++);
  if (iter != bufferMap.end())
    return iter->second->find(fKey, lKey, cont);
  cont = DTBufferTreeTrait<Content>::getDefault();
  return 1;
}

template <class Key, class Content>
int DTBufferTree<Key, Content>::find(const Key& k,
                                     typename DTBufferTreeTrait<Content>::outputTypeOfNonConstFind& cont) {
  map_iter iter = bufferMap.find(k);
  if (iter != bufferMap.end()) {
    cont = DTBufferTreeTrait<Content>::getOutputValue(iter->second->bufferContent);
    return 0;
  }
  cont = DTBufferTreeTrait<Content>::getDefault();
  return 1;
}