Example #1
0
 bool Insert(const ClosingPair &p) {
   auto found = FindRange(p);
   if (found.first == 0 && found.second == 0) {
     const auto result = closing_pairs.insert(p);
     if (!result.second)
       result.first->second = p.second;
     RemoveRange(std::next(result.first), p.second);
     return true;
   } else {
     return false;
   }
 }
Example #2
0
			unsigned int decode(model_type const & model)
			{
				uint32_t const Count = GetCurrentCount(model.getTotal());

				unsigned int Symbol;
				for(Symbol=model.getSigma()-1;model.getLow(Symbol)>Count;Symbol--)
				{
				}

				RemoveRange(model.getLow(Symbol),model.getHigh(Symbol),model.getTotal());
						
				return Symbol;
			}
Example #3
0
void Clipper::RemoveClipRange(angle_t start, angle_t end)
{
    ClipNode *node, *temp;

    if (cliphead)
    {
        //check to see if range contains any old ranges
        node = cliphead;
        while (node != NULL && node->start < end)
        {
            if (node->start >= start && node->end <= end)
            {
                temp = node;
                node = node->next;
                RemoveRange(temp);
            }
            else
            {
                node = node->next;
            }
        }

        //check to see if range overlaps a range (or possibly 2)
        node = cliphead;
        while (node != NULL)
        {
            if (node->start >= start && node->start <= end)
            {
                node->start = end;
                break;
            }
            else if (node->end >= start && node->end <= end)
            {
                node->end=start;
            }
            else if (node->start < start && node->end > end)
            {
                temp=ClipNode::NewRange(end, node->end);
                node->end=start;
                temp->next=node->next;
                temp->prev=node;
                node->next=temp;
                if (temp->next) temp->next->prev=temp;
                break;
            }
            node = node->next;
        }
    }
}
Example #4
0
int main()
{
	setlocale(LC_ALL, "Russian");
	while (true)
	{
		//CreateTestFile();
		ShowMenu();
		char choice = getchar();
		switch (choice)
		{
			case '1':
				OpenFile();
				break;
			case '2':
				Add();
				break;
			case '3':
				Print();
				break;
			case '4':
				SaveFile();
				break;
			case '5':
				Edit();
				break;
			case '6':
				Sort();
				break;
			case '7':
				RemoveRange();
				break;
			case '8':
				Exit();
				break;
			default:
				break;
		}
	}
    return 0;
}
Example #5
0
void Clipper::AddClipRange(angle_t start, angle_t end)
{
    ClipNode *node, *temp, *prevNode;

    if (cliphead)
    {
        //check to see if range contains any old ranges
        node = cliphead;
        while (node != NULL && node->start < end)
        {
            if (node->start >= start && node->end <= end)
            {
                temp = node;
                node = node->next;
                RemoveRange(temp);
            }
            else if (node->start<=start && node->end>=end)
            {
                return;
            }
            else
            {
                node = node->next;
            }
        }

        //check to see if range overlaps a range (or possibly 2)
        node = cliphead;
        while (node != NULL && node->start <= end)
        {
            if (node->end >= start)
            {
                // we found the first overlapping node
                if (node->start > start)
                {
                    // the new range overlaps with this node's start point
                    node->start = start;
                }

                if (node->end < end)
                {
                    node->end = end;
                }

                ClipNode *node2 = node->next;
                while (node2 && node2->start <= node->end)
                {
                    if (node2->end > node->end) node->end = node2->end;
                    ClipNode *delnode = node2;
                    node2 = node2->next;
                    RemoveRange(delnode);
                }
                return;
            }
            node = node->next;
        }

        //just add range
        node = cliphead;
        prevNode = NULL;
        temp = ClipNode::NewRange(start, end);

        while (node != NULL && node->start < end)
        {
            prevNode = node;
            node = node->next;
        }

        temp->next = node;
        if (node == NULL)
        {
            temp->prev = prevNode;
            if (prevNode) prevNode->next = temp;
            if (!cliphead) cliphead = temp;
        }
        else
        {
            if (node == cliphead)
            {
                cliphead->prev = temp;
                cliphead = temp;
            }
            else
            {
                temp->prev = prevNode;
                prevNode->next = temp;
                node->prev = temp;
            }
        }
    }
    else
    {
        temp = ClipNode::NewRange(start, end);
        cliphead = temp;
        return;
    }
}
Example #6
0
//-----------------------------------------------------------------------------
//
// AddClipRange
//
//-----------------------------------------------------------------------------
void Clipper::AddClipRange(angle_t start, angle_t end)
{
	ClipNode *node, *temp, *prevNode;

	if (cliphead)
	{
		//check to see if range contains any old ranges
		node = cliphead;
		while (node != NULL && node->start < end)
		{
			if (node->start >= start && node->end <= end)
			{
				temp = node;
				node = node->next;
				RemoveRange(temp);
			}
			else if (node->start<=start && node->end>=end)
			{
				return;
			}
			else
			{
				node = node->next;
			}
		}
		
		//check to see if range overlaps a range (or possibly 2)
		node = cliphead;
		while (node != NULL)
		{
			if (node->start >= start && node->start <= end)
			{
				node->start = start;
				return;
			}
			
			if (node->end >= start && node->end <= end)
			{
				// check for possible merger
				if (node->next && node->next->start <= end)
				{
					node->end = node->next->end;
					RemoveRange(node->next);
				}
				else
				{
					node->end = end;
				}
				
				return;
			}
			
			node = node->next;
		}
		
		//just add range
		node = cliphead;
		prevNode = NULL;
		temp = ClipNode::NewRange(start, end);
		
		while (node != NULL && node->start < end)
		{
			prevNode = node;
			node = node->next;
		}
		
		temp->next = node;
		if (node == NULL)
		{
			temp->prev = prevNode;
			if (prevNode) prevNode->next = temp;
			if (!cliphead) cliphead = temp;
		}
		else
		{
			if (node == cliphead)
			{
				cliphead->prev = temp;
				cliphead = temp;
			}
			else
			{
				temp->prev = prevNode;
				prevNode->next = temp;
				node->prev = temp;
			}
		}
	}
	else
	{
		temp = ClipNode::NewRange(start, end);
		cliphead = temp;
		return;
	}
}
struct ZippedUniqueObjectCollection
{
	// apply _func_ to _graphics_ and _physics_
#define DOBOTH(func) graphics.func; physics.func;
	UniqueObjectCollection graphics, physics;

	inline void Add(WorldObject& obj)
	{
		DOBOTH(Add(obj))
	}

	template<typename Iter>
	inline void AddRange(Iter begin, Iter end)
	{
		DOBOTH(AddRange(begin, end))
	}

	inline void Remove(WorldObject& obj)
	{
		DOBOTH(Remove(obj))
	}

	template<typename Iter>
	inline void RemoveRange(Iter begin, Iter end)
	{
		DOBOTH(RemoveRange(begin, end))
	}

#undef DOBOTH
};