17 #ifndef MOMO_INCLUDE_GUARD_STDISH_VECTOR
18 #define MOMO_INCLUDE_GUARD_STDISH_VECTOR
21 # if __has_include(<momo/Utility.h>)
25 #ifndef MOMO_PARENT_HEADER
26 # include "../Utility.h"
29 #include MOMO_PARENT_HEADER(Array)
31 #ifdef MOMO_HAS_CONTAINERS_RANGES
52 template<
typename TValue,
53 typename TAllocator = std::allocator<TValue>,
54 typename TArray = Array<TValue, MemManagerStd<TAllocator>>>
92 : mArray(MemManager(alloc))
97 : mArray(count, MemManager(alloc))
102 : mArray(count, value, MemManager(alloc))
106 template<
typename Iterator,
107 typename =
typename std::iterator_traits<Iterator>::iterator_category>
109 : mArray(first, last, MemManager(alloc))
114 : mArray(values, MemManager(alloc))
118 #ifdef MOMO_HAS_CONTAINERS_RANGES
119 template<std::ranges::input_range Range>
120 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
122 : mArray(
std::ranges::
begin(values),
std::ranges::
end(values), MemManager(alloc))
125 #endif // MOMO_HAS_CONTAINERS_RANGES
128 :
vector(std::move(right), right.get_allocator())
133 noexcept(std::is_empty<allocator_type>::value)
136 if (right.get_allocator() == alloc)
138 mArray.Swap(right.mArray);
142 pvAssign(std::make_move_iterator(right.begin()), std::make_move_iterator(right.end()));
143 right.mArray.Clear(
true);
148 : mArray(right.mArray)
153 : mArray(right.mArray, MemManager(alloc))
198 return mArray.GetBegin();
203 return mArray.GetBegin();
208 return mArray.GetEnd();
213 return mArray.GetEnd();
258 return mArray.GetItems();
263 return mArray.GetItems();
273 return std::allocator_traits<allocator_type>::max_size(
get_allocator());
278 return mArray.GetCount();
283 mArray.SetCount(
size);
288 mArray.SetCount(
size, value);
293 return mArray.IsEmpty();
303 return mArray.GetCapacity();
308 mArray.Reserve(count);
318 return mArray[index];
323 return mArray[index];
329 throw std::out_of_range(
"invalid vector subscript");
330 return mArray[index];
336 throw std::out_of_range(
"invalid vector subscript");
337 return mArray[index];
352 return mArray.GetBackItem();
357 return mArray.GetBackItem();
362 mArray.AddBack(std::move(value));
367 mArray.AddBack(value);
373 mArray.Insert(index, std::move(value));
380 mArray.Insert(index, value);
387 mArray.Insert(index, count, value);
391 template<
typename Iterator,
392 typename =
typename std::iterator_traits<Iterator>::iterator_category>
396 mArray.Insert(index, first, last);
403 mArray.Insert(index, values);
407 template<
typename... ValueArgs>
410 mArray.AddBackVar(std::forward<ValueArgs>(valueArgs)...);
414 template<
typename... ValueArgs>
418 mArray.InsertVar(index, std::forward<ValueArgs>(valueArgs)...);
422 #ifdef MOMO_HAS_CONTAINERS_RANGES
423 template<std::ranges::input_range Range>
424 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
425 void append_range(Range&& values)
427 insert_range(
cend(), std::forward<Range>(values));
430 template<std::ranges::input_range Range>
431 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
435 mArray.Insert(index, std::ranges::begin(values), std::ranges::end(values));
438 #endif // MOMO_HAS_CONTAINERS_RANGES
447 return erase(where, where + 1);
457 template<
typename ValueArg>
460 auto valueFilter = [&valueArg] (
const value_type& value)
461 {
return value == valueArg; };
462 return cont.mArray.Remove(valueFilter);
465 template<
typename ValueFilter>
468 return cont.mArray.Remove(valueFilter);
476 template<
typename Iterator,
477 typename =
typename std::iterator_traits<Iterator>::iterator_category>
478 void assign(Iterator first, Iterator last)
480 pvAssign(first, last);
483 void assign(std::initializer_list<value_type> values)
485 pvAssign(values.begin(), values.end());
488 #ifdef MOMO_HAS_CONTAINERS_RANGES
489 template<std::ranges::input_range Range>
490 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
491 void assign_range(Range&& values)
493 pvAssign(std::ranges::begin(values), std::ranges::end(values));
495 #endif // MOMO_HAS_CONTAINERS_RANGES
499 return left.mArray.IsEqual(right.mArray);
502 #ifdef MOMO_HAS_THREE_WAY_COMPARISON
503 friend auto operator<=>(
const vector& left,
const vector& right)
504 requires requires (
const_reference ref) { std::tie(ref) <=> std::tie(ref); }
507 {
return std::tie(value1) <=> std::tie(value2); };
508 return std::lexicographical_compare_three_way(left.begin(), left.end(),
509 right.begin(), right.end(), valueThreeComp);
514 return std::lexicographical_compare(left.
begin(), left.
end(), right.
begin(), right.
end());
521 template<
typename Iterator,
typename Sentinel>
522 void pvAssign(Iterator
begin, Sentinel
end)
531 #ifdef MOMO_HAS_DEDUCTION_GUIDES
535 template<
typename Allocator,
536 typename = decltype(std::declval<Allocator&>().allocate(
size_t{}))>
542 template<
typename Iterator,
543 typename Value =
typename std::iterator_traits<Iterator>::value_type,
544 typename Allocator = std::allocator<Value>,
545 typename = internal::vector_checker<Allocator>>
546 vector(Iterator, Iterator, Allocator = Allocator())
547 -> vector<Value, Allocator>;
549 #ifdef MOMO_HAS_CONTAINERS_RANGES
550 template<std::ranges::input_range Range,
551 typename Value = std::ranges::range_value_t<Range>,
552 typename Allocator = std::allocator<Value>,
553 typename = internal::vector_checker<Allocator>>
554 vector(std::from_range_t, Range&&, Allocator = Allocator())
555 -> vector<Value, Allocator>;
556 #endif // MOMO_HAS_CONTAINERS_RANGES
558 #endif // MOMO_HAS_DEDUCTION_GUIDES
569 template<
size_t tInternalCapacity,
typename TValue,
570 typename TAllocator = std::allocator<TValue>>
578 #endif // MOMO_INCLUDE_GUARD_STDISH_VECTOR