Exemplo n.º 1
0
	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();
	};
Exemplo n.º 2
0
	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;
	};