2019-10-29 Jonathan Wakely <jwakely@redhat.com>
+ * testsuite/util/testsuite_iterators.h (BoundsContainer::size()): Add
+ new member function.
+ (WritableObject::operator=): Constrain with enable_if when available.
+ (remove_cv): Use std::remove_if when available.
+ (test_container::it(int)): Use size().
+ (test_container::size()): Use BoundsContainer::size().
+
PR libstdc++/92267
* include/bits/stl_deque.h (_Deque_iterator(const _Deque_iterator&)):
Do not define as defaulted.
{
T* first;
T* last;
+
BoundsContainer(T* _first, T* _last) : first(_first), last(_last)
{ }
+
+ std::size_t size() const { return last - first; }
};
// Simple container for holding state of a set of output iterators.
{
T* incrementedto;
bool* writtento;
+
OutputContainer(T* _first, T* _last)
- : BoundsContainer<T>(_first, _last), incrementedto(_first)
- {
- writtento = new bool[this->last - this->first];
- for(int i = 0; i < this->last - this->first; i++)
- writtento[i] = false;
- }
+ : BoundsContainer<T>(_first, _last), incrementedto(_first),
+ writtento(new bool[this->size()]())
+ { }
~OutputContainer()
{ delete[] writtento; }
public:
OutputContainer<T>* SharedInfo;
- WritableObject(T* ptr_in,OutputContainer<T>* SharedInfo_in):
+
+ WritableObject(T* ptr_in, OutputContainer<T>* SharedInfo_in):
ptr(ptr_in), SharedInfo(SharedInfo_in)
{ }
#if __cplusplus >= 201103L
template<class U>
- void
+ typename std::enable_if<std::is_assignable<T&, U>::value>::type
operator=(U&& new_val)
{
ITERATOR_VERIFY(SharedInfo->writtento[ptr - SharedInfo->first] == 0);
void operator,(const T&, const output_iterator_wrapper<U>&) = delete;
#endif
+#if __cplusplus >= 2011L
+ using std::remove_cv;
+#else
template<typename T> struct remove_cv { typedef T type; };
template<typename T> struct remove_cv<const T> { typedef T type; };
template<typename T> struct remove_cv<volatile T> { typedef T type; };
template<typename T> struct remove_cv<const volatile T> { typedef T type; };
+#endif
/**
* @brief input_iterator wrapper for pointer
struct test_container
{
typename ItType<T>::ContainerType bounds;
+
test_container(T* _first, T* _last) : bounds(_first, _last)
{ }
ItType<T>
it(int pos)
{
- ITERATOR_VERIFY(pos >= 0 && pos <= (bounds.last - bounds.first));
+ ITERATOR_VERIFY(pos >= 0 && pos <= size());
return ItType<T>(bounds.first + pos, &bounds);
}
std::size_t
size() const
- { return bounds.last - bounds.first; }
+ { return bounds.size(); }
};
}
#endif