15#ifndef WPIUTIL_WPI_SMALLPTRSET_H
16#define WPIUTIL_WPI_SMALLPTRSET_H
26#include <initializer_list>
78 assert(SmallSize && (SmallSize & (SmallSize-1)) == 0 &&
79 "Initial size must be a power of two!");
101 return shrink_and_clear();
116 return reinterpret_cast<void*
>(-1);
126 std::pair<const void *const *, bool>
insert_imp(
const void *Ptr) {
129 const void **LastTombstone =
nullptr;
132 const void *Value = *APtr;
134 return std::make_pair(APtr,
false);
136 LastTombstone = APtr;
140 if (LastTombstone !=
nullptr) {
141 *LastTombstone = Ptr;
144 return std::make_pair(LastTombstone,
true);
155 return insert_imp_big(Ptr);
163 const void *
const *P =
find_imp(Ptr);
167 const void **Loc =
const_cast<const void **
>(P);
168 assert(*Loc == Ptr &&
"broken find!");
177 const void *
const *
find_imp(
const void * Ptr)
const {
188 auto *Bucket = FindBucketFor(Ptr);
197 std::pair<const void *const *, bool> insert_imp_big(
const void *Ptr);
199 const void *
const *FindBucketFor(
const void *Ptr)
const;
200 void shrink_and_clear();
203 void Grow(
unsigned NewSize);
266template <
typename PtrTy>
288 return PtrTraits::getFromVoidPointer(
const_cast<void *
>(
Bucket[-1]));
291 return PtrTraits::getFromVoidPointer(
const_cast<void*
>(*
Bucket));
316struct RoundUpToPowerOfTwo;
320template<
unsigned N,
bool isPowerTwo>
343template <
typename PtrType>
365 std::pair<iterator, bool>
insert(PtrType Ptr) {
366 auto p =
insert_imp(PtrTraits::getAsVoidPointer(Ptr));
367 return std::make_pair(makeIterator(p.first), p.second);
380 return erase_imp(PtrTraits::getAsVoidPointer(Ptr));
387 return makeIterator(
find_imp(ConstPtrTraits::getAsVoidPointer(Ptr)));
393 template <
typename IterT>
399 void insert(std::initializer_list<PtrType> IL) {
400 insert(IL.begin(), IL.end());
412 iterator makeIterator(
const void *
const *P)
const {
423template <
typename PtrType>
429 for (
const auto *KV : LHS)
439template <
typename PtrType>
442 return !(LHS == RHS);
449template<
class PtrType,
unsigned SmallSize>
454 static_assert(SmallSize <= 32,
"SmallSize should be small");
461 const void *SmallStorage[SmallSizePowTwo];
467 :
BaseT(SmallStorage, SmallSizePowTwo,
std::move(that)) {}
469 template<
typename It>
475 :
BaseT(SmallStorage, SmallSizePowTwo) {
476 this->
insert(IL.begin(), IL.end());
489 this->
MoveFrom(SmallSizePowTwo, std::move(RHS));
496 this->
insert(IL.begin(), IL.end());
511 template<
class T,
unsigned N>
#define LLVM_NODISCARD
LLVM_NODISCARD - Warn if a type or return value is discarded.
Definition: Compiler.h:177
This file defines the DebugEpochBase and DebugEpochBase::HandleBase classes.
and restrictions which apply to each piece of software is included later in this file and or inside of the individual applicable source files The disclaimer of warranty in the WPILib license above applies to all code in and nothing in any of the other licenses gives permission to use the names of FIRST nor the names of the WPILib contributors to endorse or promote products derived from this software The following pieces of software have additional or alternate and or Google Inc All rights reserved Redistribution and use in source and binary with or without are permitted provided that the following conditions are this list of conditions and the following disclaimer *Redistributions in binary form must reproduce the above copyright this list of conditions and the following disclaimer in the documentation and or other materials provided with the distribution *Neither the name of Google Inc nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY EXPRESS OR IMPLIED BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY OR CONSEQUENTIAL WHETHER IN STRICT OR EVEN IF ADVISED OF THE POSSIBILITY OF SUCH January AND DISTRIBUTION Definitions License shall mean the terms and conditions for and distribution as defined by Sections through of this document Licensor shall mean the copyright owner or entity authorized by the copyright owner that is granting the License Legal Entity shall mean the union of the acting entity and all other entities that control are controlled by or are under common control with that entity For the purposes of this definition control direct or to cause the direction or management of such whether by contract or including but not limited to software source documentation and configuration files Object form shall mean any form resulting from mechanical transformation or translation of a Source including but not limited to compiled object generated and conversions to other media types Work shall mean the work of whether in Source or Object made available under the as indicated by a copyright notice that is included in or attached to the whether in Source or Object that is based or other modifications as a an original work of authorship For the purposes of this Derivative Works shall not include works that remain separable or merely the Work and Derivative Works thereof Contribution shall mean any work of including the original version of the Work and any modifications or additions to that Work or Derivative Works that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner For the purposes of this submitted means any form of or written communication sent to the Licensor or its including but not limited to communication on electronic mailing source code control and issue tracking systems that are managed or on behalf the Licensor for the purpose of discussing and improving the but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as Not a Contribution Contributor shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work Grant of Copyright License Subject to the terms and conditions of this each Contributor hereby grants to You a non no royalty free
Definition: ThirdPartyNotices.txt:151
A base class for iterator classes ("handles") that wish to poll for iterator invalidating modificatio...
Definition: EpochTracker.h:57
bool isHandleInSync() const
Returns true if the DebugEpochBase this Handle is linked to has not called incrementEpoch on itself s...
Definition: EpochTracker.h:70
HandleBase()
Definition: EpochTracker.h:62
A base class for data structure classes wishing to make iterators ("handles") pointing into themselve...
Definition: EpochTracker.h:35
void incrementEpoch()
Calling incrementEpoch invalidates all handles pointing into the calling instance.
Definition: EpochTracker.h:43
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:450
SmallPtrSet< PtrType, SmallSize > & operator=(SmallPtrSet< PtrType, SmallSize > &&RHS)
Definition: SmallPtrSet.h:487
SmallPtrSet(SmallPtrSet &&that)
Definition: SmallPtrSet.h:466
SmallPtrSet(std::initializer_list< PtrType > IL)
Definition: SmallPtrSet.h:474
SmallPtrSet(It I, It E)
Definition: SmallPtrSet.h:470
SmallPtrSet< PtrType, SmallSize > & operator=(const SmallPtrSet< PtrType, SmallSize > &RHS)
Definition: SmallPtrSet.h:480
SmallPtrSet< PtrType, SmallSize > & operator=(std::initializer_list< PtrType > IL)
Definition: SmallPtrSet.h:494
void swap(SmallPtrSet< PtrType, SmallSize > &RHS)
swap - Swaps the elements of two sets.
Definition: SmallPtrSet.h:501
SmallPtrSet(const SmallPtrSet &that)
Definition: SmallPtrSet.h:465
SmallPtrSet()
Definition: SmallPtrSet.h:464
SmallPtrSetImplBase - This is the common code shared among all the SmallPtrSet<>'s,...
Definition: SmallPtrSet.h:50
std::pair< const void *const *, bool > insert_imp(const void *Ptr)
insert_imp - This returns true if the pointer was new to the set, false if it was already in the set.
Definition: SmallPtrSet.h:126
unsigned NumNonEmpty
Number of elements in CurArray that contain a value or are a tombstone.
Definition: SmallPtrSet.h:65
const void ** SmallArray
SmallArray - Points to a fixed size set of buckets, used in 'small mode'.
Definition: SmallPtrSet.h:55
unsigned size_type
Definition: SmallPtrSet.h:88
SmallPtrSetImplBase & operator=(const SmallPtrSetImplBase &)=delete
~SmallPtrSetImplBase()
Definition: SmallPtrSet.h:82
SmallPtrSetImplBase(const void **SmallStorage, const SmallPtrSetImplBase &that)
unsigned CurArraySize
CurArraySize - The allocated size of CurArray, always a power of two.
Definition: SmallPtrSet.h:60
static void * getTombstoneMarker()
Definition: SmallPtrSet.h:111
static void * getEmptyMarker()
Definition: SmallPtrSet.h:113
const void *const * find_imp(const void *Ptr) const
Returns the raw pointer needed to construct an iterator.
Definition: SmallPtrSet.h:177
void swap(SmallPtrSetImplBase &RHS)
swap - Swaps the elements of two sets.
SmallPtrSetImplBase(const void **SmallStorage, unsigned SmallSize)
Definition: SmallPtrSet.h:75
unsigned NumTombstones
Number of tombstones in CurArray.
Definition: SmallPtrSet.h:67
void clear()
Definition: SmallPtrSet.h:95
size_type size() const
Definition: SmallPtrSet.h:93
bool erase_imp(const void *Ptr)
erase_imp - If the set contains the specified pointer, remove it and return true, otherwise return fa...
Definition: SmallPtrSet.h:162
void MoveFrom(unsigned SmallSize, SmallPtrSetImplBase &&RHS)
SmallPtrSetImplBase(const void **SmallStorage, unsigned SmallSize, SmallPtrSetImplBase &&that)
const void ** EndPointer() const
Definition: SmallPtrSet.h:119
void CopyFrom(const SmallPtrSetImplBase &RHS)
const void ** CurArray
CurArray - This is the current set of buckets.
Definition: SmallPtrSet.h:58
LLVM_NODISCARD bool empty() const
Definition: SmallPtrSet.h:92
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Definition: SmallPtrSet.h:344
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:365
SmallPtrSetIterator< PtrType > iterator
Definition: SmallPtrSet.h:354
bool erase(PtrType Ptr)
erase - If the set contains the specified pointer, remove it and return true, otherwise return false.
Definition: SmallPtrSet.h:379
iterator find(ConstPtrType Ptr) const
Definition: SmallPtrSet.h:386
void insert(std::initializer_list< PtrType > IL)
Definition: SmallPtrSet.h:399
iterator end() const
Definition: SmallPtrSet.h:408
ConstPtrType key_type
Definition: SmallPtrSet.h:356
bool contains(ConstPtrType Ptr) const
Definition: SmallPtrSet.h:389
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
Definition: SmallPtrSet.h:383
iterator begin() const
Definition: SmallPtrSet.h:403
iterator insert(iterator, PtrType Ptr)
Insert the given pointer with an iterator hint that is ignored.
Definition: SmallPtrSet.h:373
PtrType value_type
Definition: SmallPtrSet.h:357
void insert(IterT I, IterT E)
Definition: SmallPtrSet.h:394
SmallPtrSetImpl(const SmallPtrSetImpl &)=delete
SmallPtrSetIterator - This implements a const_iterator for SmallPtrSet.
Definition: SmallPtrSet.h:268
PtrTy value_type
Definition: SmallPtrSet.h:272
std::ptrdiff_t difference_type
Definition: SmallPtrSet.h:275
SmallPtrSetIterator(const void *const *BP, const void *const *E, const DebugEpochBase &Epoch)
Definition: SmallPtrSet.h:278
PtrTy pointer
Definition: SmallPtrSet.h:274
std::forward_iterator_tag iterator_category
Definition: SmallPtrSet.h:276
PtrTy reference
Definition: SmallPtrSet.h:273
SmallPtrSetIterator & operator++()
Definition: SmallPtrSet.h:294
const PtrTy operator*() const
Definition: SmallPtrSet.h:284
SmallPtrSetIterator operator++(int)
Definition: SmallPtrSet.h:306
SmallPtrSetIteratorImpl - This is the common base class shared between all instances of SmallPtrSetIt...
Definition: SmallPtrSet.h:222
bool operator!=(const SmallPtrSetIteratorImpl &RHS) const
Definition: SmallPtrSet.h:240
void AdvanceIfNotValid()
AdvanceIfNotValid - If the current bucket isn't valid, advance to a bucket that is.
Definition: SmallPtrSet.h:248
const void *const * Bucket
Definition: SmallPtrSet.h:224
const void *const * End
Definition: SmallPtrSet.h:225
bool operator==(const SmallPtrSetIteratorImpl &RHS) const
Definition: SmallPtrSet.h:237
SmallPtrSetIteratorImpl(const void *const *BP, const void *const *E)
Definition: SmallPtrSet.h:228
void RetreatIfNotValid()
Definition: SmallPtrSet.h:255
Definition: BFloat16.h:88
void swap(wpi::SmallPtrSet< T, N > &LHS, wpi::SmallPtrSet< T, N > &RHS)
Implement std::swap in terms of SmallPtrSet swap.
Definition: SmallPtrSet.h:512
Definition: AprilTagFieldLayout.h:18
bool operator==(const DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT > &LHS, const DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT > &RHS)
Equality comparison for DenseMap.
Definition: DenseMap.h:686
bool operator!=(const DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT > &LHS, const DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT > &RHS)
Inequality comparison for DenseMap.
Definition: DenseMap.h:706
bool shouldReverseIterate()
Definition: ReverseIteration.h:9
A traits type that is used to handle pointer types and things that are just wrappers for pointers as ...
Definition: PointerLikeTypeTraits.h:25
RoundUpToPowerOfTwoH - If N is not a power of two, increase it.
Definition: SmallPtrSet.h:321
@ Val
Definition: SmallPtrSet.h:322
RoundUpToPowerOfTwo - This is a helper template that rounds N up to the next power of two (which mean...
Definition: SmallPtrSet.h:334
@ Val
Definition: SmallPtrSet.h:335
const T type
Definition: type_traits.h:55