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; } }
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; }
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; } } }
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; }
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; } }
//----------------------------------------------------------------------------- // // 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 };