summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/smallvec_type.hpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/core/smallvec_type.hpp b/src/core/smallvec_type.hpp
index 464274c4d..a7a0fbad4 100644
--- a/src/core/smallvec_type.hpp
+++ b/src/core/smallvec_type.hpp
@@ -81,6 +81,58 @@ public:
}
/**
+ * Search for the first occurence of an item.
+ * The '!=' operator of T is used for comparison.
+ * @param item Item to search for
+ * @return The position of the item, or End() when not present
+ */
+ FORCEINLINE const T *Find(const T &item) const
+ {
+ const T *pos = this->Begin();
+ const T *end = this->End();
+ while (pos != end && *pos != item) pos++;
+ return pos;
+ }
+
+ /**
+ * Search for the first occurence of an item.
+ * The '!=' operator of T is used for comparison.
+ * @param item Item to search for
+ * @return The position of the item, or End() when not present
+ */
+ FORCEINLINE T *Find(const T &item)
+ {
+ T *pos = this->Begin();
+ const T *end = this->End();
+ while (pos != end && *pos != item) pos++;
+ return pos;
+ }
+
+ /**
+ * Tests whether a item is present in the vector.
+ * The '!=' operator of T is used for comparison.
+ * @param item Item to test for
+ * @return true iff the item is present
+ */
+ FORCEINLINE bool Contains(const T &item) const
+ {
+ return this->Find(item) != this->End();
+ }
+
+ /**
+ * Tests whether a item is present in the vector, and appends it to the end if not.
+ * The '!=' operator of T is used for comparison.
+ * @param item Item to test for
+ * @return true iff the item is was already present
+ */
+ FORCEINLINE bool Include(const T &item)
+ {
+ bool is_member = this->Contains(item);
+ if (!is_member) *this->Append() = item;
+ return is_member;
+ }
+
+ /**
* Get the number of items in the list.
*/
FORCEINLINE uint Length() const