intrusive_list: Support inserters
Allows std::inserter, std::back_inserter, and std::front_inserter to work with intrusive lists.
This commit is contained in:
parent
36a0ad5bc2
commit
23d190f7b0
2 changed files with 27 additions and 38 deletions
|
@ -54,38 +54,37 @@ public:
|
|||
using reverse_iterator = std::reverse_iterator<iterator>;
|
||||
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
|
||||
|
||||
/**
|
||||
* Inserts a node at the given location indicated by an iterator.
|
||||
*
|
||||
* @param location The location to insert the node.
|
||||
* @param new_node The node to add.
|
||||
*/
|
||||
iterator insert(iterator location, pointer new_node) {
|
||||
auto existing_node = location.AsNodePointer();
|
||||
|
||||
new_node->next = existing_node;
|
||||
new_node->prev = existing_node->prev;
|
||||
existing_node->prev->next = new_node;
|
||||
existing_node->prev = new_node;
|
||||
|
||||
return iterator(root.get(), new_node);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an entry to the start of the list.
|
||||
* @param node Node to add to the list.
|
||||
*/
|
||||
void Prepend(reference node) {
|
||||
AddAfter(root.get(), &node);
|
||||
void push_front(pointer node) {
|
||||
insert(begin(), node);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an entry to the end of the list
|
||||
* @param node Node to add to the list.
|
||||
* @param node Node to add to the list.
|
||||
*/
|
||||
void Append(reference node) {
|
||||
AddBefore(root.get(), &node);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an entry after an existing node in this list
|
||||
* @param existing_node Node to add new_node after. Must already be member of the list.
|
||||
* @param new_node Node to add to the list.
|
||||
*/
|
||||
void AddAfter(reference existing, reference node) {
|
||||
AddAfter(&existing, &node);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an entry before an existing node in this list
|
||||
* @param existing_node Node to add new_node before. Must already be member of the list.
|
||||
* @param new_node Node to add to the list.
|
||||
*/
|
||||
void AddBefore(reference existing, reference node) {
|
||||
AddBefore(&existing, &node);
|
||||
void push_back(pointer node) {
|
||||
insert(end(), node);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -133,20 +132,6 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
void AddAfter(IntrusiveListNode<T>* existing_node, IntrusiveListNode<T>* new_node) {
|
||||
new_node->next = existing_node->next;
|
||||
new_node->prev = existing_node;
|
||||
existing_node->next->prev = new_node;
|
||||
existing_node->next = new_node;
|
||||
}
|
||||
|
||||
void AddBefore(IntrusiveListNode<T>* existing_node, IntrusiveListNode<T>* new_node) {
|
||||
new_node->next = existing_node;
|
||||
new_node->prev = existing_node->prev;
|
||||
existing_node->prev->next = new_node;
|
||||
existing_node->prev = new_node;
|
||||
}
|
||||
|
||||
std::shared_ptr<IntrusiveListNode<T>> root = std::make_shared<IntrusiveListNode<T>>();
|
||||
};
|
||||
|
||||
|
@ -211,6 +196,10 @@ public:
|
|||
return std::addressof(operator*());
|
||||
}
|
||||
|
||||
node_pointer AsNodePointer() const {
|
||||
return node;
|
||||
}
|
||||
|
||||
private:
|
||||
friend class IntrusiveList<T>;
|
||||
node_pointer root = nullptr;
|
||||
|
|
|
@ -515,7 +515,7 @@ IR::Value IREmitter::Inst(IR::Opcode op, std::initializer_list<IR::Value> args)
|
|||
index++;
|
||||
});
|
||||
|
||||
block.instructions.Append(*inst);
|
||||
block.instructions.push_back(inst);
|
||||
return IR::Value(inst);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue