18 #ifndef MOMO_INCLUDE_GUARD_STDISH_VECTOR
19 #define MOMO_INCLUDE_GUARD_STDISH_VECTOR
22 # if __has_include(<momo/Utility.h>)
26 #ifndef MOMO_PARENT_HEADER
27 # include "../Utility.h"
30 #include MOMO_PARENT_HEADER(Array)
32 #ifdef MOMO_HAS_CONTAINERS_RANGES
42 template<
typename TArray>
53 typedef typename std::allocator_traits<typename MemManager::ByteAllocator>
81 : mArray(MemManager(alloc))
86 : mArray(count, MemManager(alloc))
92 : mArray(count, value, MemManager(alloc))
96 template<
typename Iterator,
97 typename =
typename std::iterator_traits<Iterator>::iterator_category>
99 : mArray(first, last, MemManager(alloc))
105 : mArray(values, MemManager(alloc))
109 #ifdef MOMO_HAS_CONTAINERS_RANGES
110 template<std::ranges::input_range Range>
111 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
113 : mArray(
std::ranges::
begin(values),
std::ranges::
end(values), MemManager(alloc))
116 #endif // MOMO_HAS_CONTAINERS_RANGES
124 noexcept(std::is_empty<allocator_type>::value)
127 if (right.get_allocator() == alloc)
129 mArray.Swap(right.mArray);
133 pvAssign(std::make_move_iterator(right.begin()), std::make_move_iterator(right.end()));
134 right.mArray.Clear(
true);
139 : mArray(right.mArray)
144 : mArray(right.mArray, MemManager(alloc))
189 return mArray.GetBegin();
194 return mArray.GetBegin();
199 return mArray.GetEnd();
204 return mArray.GetEnd();
249 return mArray.GetItems();
254 return mArray.GetItems();
264 return std::allocator_traits<allocator_type>::max_size(
get_allocator());
269 return mArray.GetCount();
274 mArray.SetCount(
size);
279 mArray.SetCount(
size, value);
284 return mArray.IsEmpty();
294 return mArray.GetCapacity();
299 mArray.Reserve(count);
309 return mArray[index];
314 return mArray[index];
320 MOMO_THROW(std::out_of_range(
"invalid vector subscript"));
321 return mArray[index];
327 MOMO_THROW(std::out_of_range(
"invalid vector subscript"));
328 return mArray[index];
343 return mArray.GetBackItem();
348 return mArray.GetBackItem();
353 mArray.AddBack(std::move(value));
358 mArray.AddBack(value);
364 mArray.Insert(index, std::move(value));
371 mArray.Insert(index, value);
378 mArray.Insert(index, count, value);
382 template<
typename Iterator,
383 typename =
typename std::iterator_traits<Iterator>::iterator_category>
387 mArray.Insert(index, first, last);
394 mArray.Insert(index, values);
398 template<
typename... ValueArgs>
401 mArray.AddBackVar(std::forward<ValueArgs>(valueArgs)...);
405 template<
typename... ValueArgs>
409 mArray.InsertVar(index, std::forward<ValueArgs>(valueArgs)...);
413 #ifdef MOMO_HAS_CONTAINERS_RANGES
414 template<std::ranges::input_range Range>
415 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
416 void append_range(Range&& values)
418 insert_range(
cend(), std::forward<Range>(values));
421 template<std::ranges::input_range Range>
422 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
426 mArray.Insert(index, std::ranges::begin(values), std::ranges::end(values));
429 #endif // MOMO_HAS_CONTAINERS_RANGES
438 return erase(where, where + 1);
448 template<
typename ValueArg = value_type>
451 auto valueFilter = [&valueArg] (
const value_type& value)
452 {
return value == valueArg; };
453 return cont.mArray.Remove(valueFilter);
456 template<
typename ValueFilter>
459 return cont.mArray.Remove(valueFilter);
467 template<
typename Iterator,
468 typename =
typename std::iterator_traits<Iterator>::iterator_category>
469 void assign(Iterator first, Iterator last)
471 pvAssign(first, last);
474 void assign(std::initializer_list<value_type> values)
476 pvAssign(values.begin(), values.end());
479 #ifdef MOMO_HAS_CONTAINERS_RANGES
480 template<std::ranges::input_range Range>
481 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
482 void assign_range(Range&& values)
484 pvAssign(std::ranges::begin(values), std::ranges::end(values));
486 #endif // MOMO_HAS_CONTAINERS_RANGES
490 return left.mArray.IsEqual(right.mArray);
493 #ifdef MOMO_HAS_THREE_WAY_COMPARISON
495 requires requires (
const_reference ref) { std::tie(ref) <=> std::tie(ref); }
498 {
return std::tie(value1) <=> std::tie(value2); };
499 return std::lexicographical_compare_three_way(left.begin(), left.end(),
500 right.begin(), right.end(), valueThreeComp);
505 return std::lexicographical_compare(left.
begin(), left.
end(), right.
begin(), right.
end());
512 template<
typename Iterator,
typename Sentinel>
513 void pvAssign(Iterator
begin, Sentinel
end)
533 template<
typename TValue,
534 typename TAllocator = std::allocator<TValue>>
541 using VectorAdaptor::VectorAdaptor;
555 #ifdef MOMO_HAS_DEDUCTION_GUIDES
559 template<
typename Allocator,
560 typename = decltype(std::declval<Allocator&>().allocate(
size_t{}))>
566 template<
typename Value,
567 typename Allocator = std::allocator<Value>,
568 typename = internal::vector_checker<Allocator>>
569 vector(
size_t, Value, Allocator = Allocator())
570 -> vector<Value, Allocator>;
571 template<
typename Iterator,
572 typename Value =
typename std::iterator_traits<Iterator>::value_type,
573 typename Allocator = std::allocator<Value>,
574 typename = internal::vector_checker<Allocator>>
575 vector(Iterator, Iterator, Allocator = Allocator())
576 -> vector<Value, Allocator>;
577 template<
typename Value,
578 typename Allocator = std::allocator<Value>,
579 typename = internal::vector_checker<Allocator>>
580 vector(std::initializer_list<Value>, Allocator = Allocator())
581 -> vector<Value, Allocator>;
582 template<
typename Value,
typename Allocator>
584 -> vector<Value, Allocator>;
586 #ifdef MOMO_HAS_CONTAINERS_RANGES
587 template<std::ranges::input_range Range,
588 typename Value = std::ranges::range_value_t<Range>,
589 typename Allocator = std::allocator<Value>,
590 typename = internal::vector_checker<Allocator>>
591 vector(std::from_range_t, Range&&, Allocator = Allocator())
592 -> vector<Value, Allocator>;
593 #endif // MOMO_HAS_CONTAINERS_RANGES
595 #endif // MOMO_HAS_DEDUCTION_GUIDES
606 template<
size_t tInternalCapacity,
typename TValue,
607 typename TAllocator = std::allocator<TValue>>
615 #endif // MOMO_INCLUDE_GUARD_STDISH_VECTOR