size_t pick(const hashT &target, NodeListT &dest, size_t limit) { //stopwatch sw("pick"); typedef std::map<hashT,T*> SortedNodePListT; SortedNodePListT sorted_list; Lock(); { typename NodeListT::iterator it = InternalList.begin(); for ( ; it != InternalList.end(); it++) { hashT _xor; hash_xor(_xor, target, it->id); sorted_list.insert(typename SortedNodePListT::value_type(_xor, &(*it))); } size_t i = 0; typename SortedNodePListT::iterator sit = sorted_list.begin(); for ( ; sit != sorted_list.end() && i < limit; sit++, i++) { dest.push_back(*(sit->second)); } } Unlock(); return (dest.size()); };
void SvCreator::attachOrphanedNodesToRoot(NodeListT& nodes, NodeT& root) { for (NodeListT::Iterator node = nodes.begin(); node != nodes.end(); ++node) { if (node->parent.isEmpty()) { node->parent = root.id; if (! root.child_nodes.isEmpty()) root.child_nodes.append(ngrt4n::CHILD_Q_SEP); root.child_nodes.append(node->id); } } }
void remove(const T &node) { typename NodeListT::iterator it; Lock(); { it = std::find(InternalList.begin(), InternalList.end(), node); if (it != InternalList.end()) InternalList.erase(it); } Unlock(); };
bool push(const T &node) { if (!node.valid()) return false; bool proceeded = false; Lock(); { typename NodeListT::iterator it; it = std::find(InternalList.begin(), InternalList.end(), node); if (it != InternalList.end()) { //既存なら最後尾へ T mnode(*it); InternalList.erase(it); mnode.marge(node); mnode.lastlink = time(NULL); InternalList.push_back(mnode); proceeded = true; } else if (InternalList.size() < Capacity) { //リストに余裕があるなら最後尾に追加 T newnode(node); newnode.lastlink = time(NULL); InternalList.push_back(newnode); proceeded = true; } #if !USEPING else { pop_front(); T newnode(node); newnode.lastlink = time(NULL); InternalList.push_back(newnode); proceeded = true; } #endif } Unlock(); #if USEPING if (proceeded) return true; //リストの一番上のノード=最古ノードの生存確認 T head; get_front(head); bool alive = ping(head); if (alive) { //最古ノードが生きている:最古ノードを最後尾へ //※対象ノードは追加しない pop_front(); head.lastlink = time(NULL); Lock(); InternalList.push_back(head); Unlock(); } else { //最古ノードが死んでいる:対象ノードを最後尾に追加 pop_front(); T newnode(node); newnode.lastlink = time(NULL); Lock(); InternalList.push_back(newnode); Unlock(); } #endif return true; };