003 File Manager
Current Path:
/usr/src/contrib/llvm-project/llvm/include/llvm/ADT
usr
/
src
/
contrib
/
llvm-project
/
llvm
/
include
/
llvm
/
ADT
/
📁
..
📄
APFloat.h
(48.83 KB)
📄
APInt.h
(74.48 KB)
📄
APSInt.h
(11.75 KB)
📄
AllocatorList.h
(7.53 KB)
📄
Any.h
(5.05 KB)
📄
ArrayRef.h
(17.92 KB)
📄
BitVector.h
(29.74 KB)
📄
Bitfields.h
(11.65 KB)
📄
BitmaskEnum.h
(5.53 KB)
📄
BreadthFirstIterator.h
(4.82 KB)
📄
CachedHashString.h
(5.9 KB)
📄
CoalescingBitVector.h
(14.91 KB)
📄
DAGDeltaAlgorithm.h
(3.13 KB)
📄
DeltaAlgorithm.h
(3.54 KB)
📄
DenseMap.h
(43.14 KB)
📄
DenseMapInfo.h
(11.4 KB)
📄
DenseSet.h
(9.33 KB)
📄
DepthFirstIterator.h
(10.37 KB)
📄
DirectedGraph.h
(9.56 KB)
📄
EnumeratedArray.h
(1.6 KB)
📄
EpochTracker.h
(3.2 KB)
📄
EquivalenceClasses.h
(10.52 KB)
📄
FloatingPointMode.h
(5.62 KB)
📄
FoldingSet.h
(30.16 KB)
📄
FunctionExtras.h
(14.55 KB)
📄
GraphTraits.h
(5.71 KB)
📄
Hashing.h
(25.12 KB)
📄
ImmutableList.h
(7.57 KB)
📄
ImmutableMap.h
(10.84 KB)
📄
ImmutableSet.h
(37.52 KB)
📄
IndexedMap.h
(2.5 KB)
📄
IntEqClasses.h
(2.87 KB)
📄
IntervalMap.h
(72.88 KB)
📄
IntrusiveRefCntPtr.h
(8.1 KB)
📄
MapVector.h
(7.79 KB)
📄
None.h
(983 B)
📄
Optional.h
(10.82 KB)
📄
PackedVector.h
(4.17 KB)
📄
PointerEmbeddedInt.h
(4.05 KB)
📄
PointerIntPair.h
(8.72 KB)
📄
PointerSumType.h
(11.61 KB)
📄
PointerUnion.h
(10.17 KB)
📄
PostOrderIterator.h
(11.05 KB)
📄
PriorityQueue.h
(2.69 KB)
📄
PriorityWorklist.h
(8.11 KB)
📄
SCCIterator.h
(8.02 KB)
📄
STLExtras.h
(70.56 KB)
📄
ScopeExit.h
(1.83 KB)
📄
ScopedHashTable.h
(8.27 KB)
📄
Sequence.h
(2.59 KB)
📄
SetOperations.h
(2.58 KB)
📄
SetVector.h
(9.39 KB)
📄
SmallBitVector.h
(20.36 KB)
📄
SmallPtrSet.h
(16.93 KB)
📄
SmallSet.h
(8.37 KB)
📄
SmallString.h
(8.55 KB)
📄
SmallVector.h
(32.33 KB)
📄
SparseBitVector.h
(26.2 KB)
📄
SparseMultiSet.h
(17.83 KB)
📄
SparseSet.h
(11.41 KB)
📄
Statistic.h
(7.01 KB)
📄
StringExtras.h
(13.25 KB)
📄
StringMap.h
(15.7 KB)
📄
StringMapEntry.h
(4.83 KB)
📄
StringRef.h
(31.68 KB)
📄
StringSet.h
(1.51 KB)
📄
StringSwitch.h
(6.25 KB)
📄
TinyPtrVector.h
(10.19 KB)
📄
Triple.h
(27.4 KB)
📄
Twine.h
(17.48 KB)
📄
TypeSwitch.h
(5.82 KB)
📄
UniqueVector.h
(3.09 KB)
📄
Waymarking.h
(11.96 KB)
📄
bit.h
(2.26 KB)
📄
edit_distance.h
(3.57 KB)
📄
fallible_iterator.h
(8.31 KB)
📄
ilist.h
(13.68 KB)
📄
ilist_base.h
(2.72 KB)
📄
ilist_iterator.h
(7.21 KB)
📄
ilist_node.h
(9.84 KB)
📄
ilist_node_base.h
(1.7 KB)
📄
ilist_node_options.h
(5.07 KB)
📄
iterator.h
(13.46 KB)
📄
iterator_range.h
(2.22 KB)
📄
simple_ilist.h
(10.78 KB)
Editing: AllocatorList.h
//===- llvm/ADT/AllocatorList.h - Custom allocator list ---------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_ADT_ALLOCATORLIST_H #define LLVM_ADT_ALLOCATORLIST_H #include "llvm/ADT/ilist_node.h" #include "llvm/ADT/iterator.h" #include "llvm/ADT/simple_ilist.h" #include "llvm/Support/Allocator.h" #include <algorithm> #include <cassert> #include <cstddef> #include <iterator> #include <type_traits> #include <utility> namespace llvm { /// A linked-list with a custom, local allocator. /// /// Expose a std::list-like interface that owns and uses a custom LLVM-style /// allocator (e.g., BumpPtrAllocator), leveraging \a simple_ilist for the /// implementation details. /// /// Because this list owns the allocator, calling \a splice() with a different /// list isn't generally safe. As such, \a splice has been left out of the /// interface entirely. template <class T, class AllocatorT> class AllocatorList : AllocatorT { struct Node : ilist_node<Node> { Node(Node &&) = delete; Node(const Node &) = delete; Node &operator=(Node &&) = delete; Node &operator=(const Node &) = delete; Node(T &&V) : V(std::move(V)) {} Node(const T &V) : V(V) {} template <class... Ts> Node(Ts &&... Vs) : V(std::forward<Ts>(Vs)...) {} T V; }; using list_type = simple_ilist<Node>; list_type List; AllocatorT &getAlloc() { return *this; } const AllocatorT &getAlloc() const { return *this; } template <class... ArgTs> Node *create(ArgTs &&... Args) { return new (getAlloc()) Node(std::forward<ArgTs>(Args)...); } struct Cloner { AllocatorList &AL; Cloner(AllocatorList &AL) : AL(AL) {} Node *operator()(const Node &N) const { return AL.create(N.V); } }; struct Disposer { AllocatorList &AL; Disposer(AllocatorList &AL) : AL(AL) {} void operator()(Node *N) const { N->~Node(); AL.getAlloc().Deallocate(N); } }; public: using value_type = T; using pointer = T *; using reference = T &; using const_pointer = const T *; using const_reference = const T &; using size_type = typename list_type::size_type; using difference_type = typename list_type::difference_type; private: template <class ValueT, class IteratorBase> class IteratorImpl : public iterator_adaptor_base<IteratorImpl<ValueT, IteratorBase>, IteratorBase, std::bidirectional_iterator_tag, ValueT> { template <class OtherValueT, class OtherIteratorBase> friend class IteratorImpl; friend AllocatorList; using base_type = iterator_adaptor_base<IteratorImpl<ValueT, IteratorBase>, IteratorBase, std::bidirectional_iterator_tag, ValueT>; public: using value_type = ValueT; using pointer = ValueT *; using reference = ValueT &; IteratorImpl() = default; IteratorImpl(const IteratorImpl &) = default; IteratorImpl &operator=(const IteratorImpl &) = default; explicit IteratorImpl(const IteratorBase &I) : base_type(I) {} template <class OtherValueT, class OtherIteratorBase> IteratorImpl(const IteratorImpl<OtherValueT, OtherIteratorBase> &X, std::enable_if_t<std::is_convertible< OtherIteratorBase, IteratorBase>::value> * = nullptr) : base_type(X.wrapped()) {} ~IteratorImpl() = default; reference operator*() const { return base_type::wrapped()->V; } pointer operator->() const { return &operator*(); } friend bool operator==(const IteratorImpl &L, const IteratorImpl &R) { return L.wrapped() == R.wrapped(); } friend bool operator!=(const IteratorImpl &L, const IteratorImpl &R) { return !(L == R); } }; public: using iterator = IteratorImpl<T, typename list_type::iterator>; using reverse_iterator = IteratorImpl<T, typename list_type::reverse_iterator>; using const_iterator = IteratorImpl<const T, typename list_type::const_iterator>; using const_reverse_iterator = IteratorImpl<const T, typename list_type::const_reverse_iterator>; AllocatorList() = default; AllocatorList(AllocatorList &&X) : AllocatorT(std::move(X.getAlloc())), List(std::move(X.List)) {} AllocatorList(const AllocatorList &X) { List.cloneFrom(X.List, Cloner(*this), Disposer(*this)); } AllocatorList &operator=(AllocatorList &&X) { clear(); // Dispose of current nodes explicitly. List = std::move(X.List); getAlloc() = std::move(X.getAlloc()); return *this; } AllocatorList &operator=(const AllocatorList &X) { List.cloneFrom(X.List, Cloner(*this), Disposer(*this)); return *this; } ~AllocatorList() { clear(); } void swap(AllocatorList &RHS) { List.swap(RHS.List); std::swap(getAlloc(), RHS.getAlloc()); } bool empty() { return List.empty(); } size_t size() { return List.size(); } iterator begin() { return iterator(List.begin()); } iterator end() { return iterator(List.end()); } const_iterator begin() const { return const_iterator(List.begin()); } const_iterator end() const { return const_iterator(List.end()); } reverse_iterator rbegin() { return reverse_iterator(List.rbegin()); } reverse_iterator rend() { return reverse_iterator(List.rend()); } const_reverse_iterator rbegin() const { return const_reverse_iterator(List.rbegin()); } const_reverse_iterator rend() const { return const_reverse_iterator(List.rend()); } T &back() { return List.back().V; } T &front() { return List.front().V; } const T &back() const { return List.back().V; } const T &front() const { return List.front().V; } template <class... Ts> iterator emplace(iterator I, Ts &&... Vs) { return iterator(List.insert(I.wrapped(), *create(std::forward<Ts>(Vs)...))); } iterator insert(iterator I, T &&V) { return iterator(List.insert(I.wrapped(), *create(std::move(V)))); } iterator insert(iterator I, const T &V) { return iterator(List.insert(I.wrapped(), *create(V))); } template <class Iterator> void insert(iterator I, Iterator First, Iterator Last) { for (; First != Last; ++First) List.insert(I.wrapped(), *create(*First)); } iterator erase(iterator I) { return iterator(List.eraseAndDispose(I.wrapped(), Disposer(*this))); } iterator erase(iterator First, iterator Last) { return iterator( List.eraseAndDispose(First.wrapped(), Last.wrapped(), Disposer(*this))); } void clear() { List.clearAndDispose(Disposer(*this)); } void pop_back() { List.eraseAndDispose(--List.end(), Disposer(*this)); } void pop_front() { List.eraseAndDispose(List.begin(), Disposer(*this)); } void push_back(T &&V) { insert(end(), std::move(V)); } void push_front(T &&V) { insert(begin(), std::move(V)); } void push_back(const T &V) { insert(end(), V); } void push_front(const T &V) { insert(begin(), V); } template <class... Ts> void emplace_back(Ts &&... Vs) { emplace(end(), std::forward<Ts>(Vs)...); } template <class... Ts> void emplace_front(Ts &&... Vs) { emplace(begin(), std::forward<Ts>(Vs)...); } /// Reset the underlying allocator. /// /// \pre \c empty() void resetAlloc() { assert(empty() && "Cannot reset allocator if not empty"); getAlloc().Reset(); } }; template <class T> using BumpPtrList = AllocatorList<T, BumpPtrAllocator>; } // end namespace llvm #endif // LLVM_ADT_ALLOCATORLIST_H
Upload File
Create Folder