summaryrefslogtreecommitdiff
path: root/absl/container/inlined_vector.h
diff options
context:
space:
mode:
Diffstat (limited to 'absl/container/inlined_vector.h')
-rw-r--r--absl/container/inlined_vector.h62
1 files changed, 15 insertions, 47 deletions
diff --git a/absl/container/inlined_vector.h b/absl/container/inlined_vector.h
index e0f1714c..493bd8eb 100644
--- a/absl/container/inlined_vector.h
+++ b/absl/container/inlined_vector.h
@@ -72,20 +72,11 @@ class InlinedVector {
}
template <typename Iterator>
- using IsAtLeastInputIterator = std::is_convertible<
- typename std::iterator_traits<Iterator>::iterator_category,
- std::input_iterator_tag>;
-
- template <typename Iterator>
using IsAtLeastForwardIterator = std::is_convertible<
typename std::iterator_traits<Iterator>::iterator_category,
std::forward_iterator_tag>;
template <typename Iterator>
- using EnableIfAtLeastInputIterator =
- absl::enable_if_t<IsAtLeastInputIterator<Iterator>::value>;
-
- template <typename Iterator>
using EnableIfAtLeastForwardIterator =
absl::enable_if_t<IsAtLeastForwardIterator<Iterator>::value>;
@@ -163,7 +154,7 @@ class InlinedVector {
InlinedVector(InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type())
: allocator_and_tag_(alloc) {
- AppendInputRange(first, last);
+ std::copy(first, last, std::back_inserter(*this));
}
// Creates a copy of `other` using `other`'s allocator.
@@ -534,7 +525,13 @@ class InlinedVector {
template <typename InputIterator,
DisableIfAtLeastForwardIterator<InputIterator>* = nullptr>
void assign(InputIterator first, InputIterator last) {
- AssignInputRange(first, last);
+ size_type assign_index = 0;
+ for (; (assign_index < size()) && (first != last);
+ static_cast<void>(++assign_index), static_cast<void>(++first)) {
+ *(data() + assign_index) = *first;
+ }
+ erase(data() + assign_index, data() + size());
+ std::copy(first, last, std::back_inserter(*this));
}
// `InlinedVector::resize()`
@@ -630,7 +627,12 @@ class InlinedVector {
template <typename InputIterator,
DisableIfAtLeastForwardIterator<InputIterator>* = nullptr>
iterator insert(const_iterator pos, InputIterator first, InputIterator last) {
- return InsertWithInputRange(pos, first, last);
+ size_type initial_insert_index = std::distance(cbegin(), pos);
+ for (size_type insert_index = initial_insert_index; first != last;
+ static_cast<void>(++insert_index), static_cast<void>(++first)) {
+ insert(data() + insert_index, *first);
+ }
+ return iterator(data() + initial_insert_index);
}
// `InlinedVector::emplace()`
@@ -1131,20 +1133,6 @@ class InlinedVector {
}
}
- template <typename InputIterator>
- void AssignInputRange(InputIterator first, InputIterator last) {
- static_assert(IsAtLeastInputIterator<InputIterator>::value, "");
-
- // Optimized to avoid reallocation.
- // Prefer reassignment to copy construction for elements.
- iterator out = begin();
- for (; first != last && out != end(); ++first, ++out) {
- *out = *first;
- }
- erase(out, end());
- std::copy(first, last, std::back_inserter(*this));
- }
-
template <typename ForwardIterator>
void AppendForwardRange(ForwardIterator first, ForwardIterator last) {
static_assert(IsAtLeastForwardIterator<ForwardIterator>::value, "");
@@ -1160,13 +1148,6 @@ class InlinedVector {
}
}
- template <typename InputIterator>
- void AppendInputRange(InputIterator first, InputIterator last) {
- static_assert(IsAtLeastInputIterator<InputIterator>::value, "");
-
- std::copy(first, last, std::back_inserter(*this));
- }
-
iterator InsertWithCount(const_iterator position, size_type n,
const_reference v) {
assert(position >= begin() && position <= end());
@@ -1198,18 +1179,6 @@ class InlinedVector {
return it_pair.first;
}
- template <typename InputIterator>
- iterator InsertWithInputRange(const_iterator position, InputIterator first,
- InputIterator last) {
- static_assert(IsAtLeastInputIterator<InputIterator>::value, "");
- assert(position >= begin() && position <= end());
-
- size_type index = position - cbegin();
- size_type i = index;
- while (first != last) insert(begin() + i++, *first++);
- return begin() + index;
- }
-
void SwapImpl(InlinedVector& other) {
using std::swap; // Augment ADL with `std::swap`.
@@ -1393,6 +1362,7 @@ auto AbslHashValue(H h, const InlinedVector<TheT, TheN, TheA>& v) -> H {
auto n = v.size();
return H::combine(H::combine_contiguous(std::move(h), p, n), n);
}
+} // namespace absl
// -----------------------------------------------------------------------------
// Implementation of InlinedVector
@@ -1400,6 +1370,4 @@ auto AbslHashValue(H h, const InlinedVector<TheT, TheN, TheA>& v) -> H {
// Do not depend on any below implementation details!
// -----------------------------------------------------------------------------
-} // namespace absl
-
#endif // ABSL_CONTAINER_INLINED_VECTOR_H_