Skip to content

Commit

Permalink
Add missing constraint to default constructors (#58)
Browse files Browse the repository at this point in the history
  • Loading branch information
lackhole authored Oct 15, 2024
1 parent ce28b2e commit 7224079
Show file tree
Hide file tree
Showing 24 changed files with 157 additions and 102 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@

.idea
cmake-build-*
build
11 changes: 10 additions & 1 deletion include/preview/__ranges/movable_box.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#include "preview/__concepts/copyable.h"
#include "preview/__concepts/copy_constructible.h"
#include "preview/__concepts/default_initializable.h"
#include "preview/__concepts/movable.h"
#include "preview/__memory/addressof.h"
#include "preview/optional.h"
Expand Down Expand Up @@ -44,7 +45,10 @@ struct movable_box_storage_base;
template<typename T>
struct movable_box_storage_base<T, true> {

constexpr movable_box_storage_base() = default;
template<bool B = default_initializable<T>::value, std::enable_if_t<B, int> = 0>
constexpr movable_box_storage_base()
noexcept(std::is_nothrow_default_constructible<T>::value)
: movable_box_storage_base(in_place) {}
constexpr movable_box_storage_base(const movable_box_storage_base&) = default;
constexpr movable_box_storage_base(movable_box_storage_base&&) = default;
constexpr movable_box_storage_base& operator=(const movable_box_storage_base&) = default;
Expand Down Expand Up @@ -130,6 +134,11 @@ template<typename T>
struct movable_box_storage_base<T, false> : private optional<T> {
using base = optional<T>;

template<bool B = default_initializable<T>::value, std::enable_if_t<B, int> = 0>
constexpr movable_box_storage_base()
noexcept(std::is_nothrow_default_constructible<T>::value)
: base(in_place) {}

using base::base;
using base::operator=;
using base::operator->;
Expand Down
9 changes: 5 additions & 4 deletions include/preview/__ranges/owning_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include <utility>

#include "preview/__concepts/default_initializable.h"
#include "preview/__concepts/movable.h"
#include "preview/__ranges/begin.h"
#include "preview/__ranges/contiguous_range.h"
Expand All @@ -32,13 +33,14 @@ class owning_view : public view_interface<owning_view<R>> {
static_assert(movable<R>::value, "Constraints not satisfied");
static_assert(is_initializer_list<R>::value == false, "Constraints not satisfied");

constexpr owning_view() = default;
template<bool B = default_initializable<R>::value, std::enable_if_t<B, int> = 0>
constexpr owning_view() {}

constexpr owning_view(owning_view&&) = default;
constexpr owning_view(const owning_view&) = delete;
constexpr owning_view(R&& t) noexcept(std::is_nothrow_move_constructible<R>::value)
: r_(std::move(t)) {}


owning_view& operator=(owning_view&&) = default;
owning_view& operator=(const owning_view&) = delete;

Expand Down Expand Up @@ -68,7 +70,6 @@ class owning_view : public view_interface<owning_view<R>> {
return ranges::end(r_);
}


template<typename T = R, std::enable_if_t<is_invocable<decltype(ranges::end), T&>::value, int> = 0>
constexpr bool empty() {
return ranges::empty(r_);
Expand Down Expand Up @@ -102,7 +103,7 @@ class owning_view : public view_interface<owning_view<R>> {
}

private:
R r_;
R r_ = R();
};

} // namespace ranges
Expand Down
16 changes: 10 additions & 6 deletions include/preview/__ranges/subrange.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "preview/__core/nodiscard.h"
#include "preview/__concepts/convertible_to.h"
#include "preview/__concepts/copyable.h"
#include "preview/__concepts/default_initializable.h"
#include "preview/__concepts/different_from.h"
#include "preview/__concepts/same_as.h"
#include "preview/__iterator/advance.h"
Expand Down Expand Up @@ -111,21 +112,25 @@ class subrange
static_assert(sentinel_for<S, I>::value, "Constraints not satisfied");
static_assert(K == subrange_kind::sized || !sized_sentinel_for<S, I>::value, "Constraints not satisfied");

subrange() = default;
template<bool B = default_initializable<I>::value, std::enable_if_t<B, int> = 0>
constexpr subrange() {}

template<typename I2, std::enable_if_t<conjunction<
detail::convertible_to_non_slicing<I2, I>,
negation<StoreSize>
>::value, int> = 0>
constexpr subrange(I2 i, S s)
: iterator_(std::move(i)), sentinel_(std::move(s)) {}
: iterator_(std::move(i))
, sentinel_(std::move(s)) {}

template<typename I2, std::enable_if_t<conjunction<
detail::convertible_to_non_slicing<I2, I>,
bool_constant< K == subrange_kind::sized >
>::value, int> = 0>
constexpr subrange(I2 i, S s, make_unsigned_like_t<iter_difference_t<I>> n)
: size_base(in_place, n), iterator_(std::move(i)), sentinel_(std::move(s)) {}
: size_base(in_place, n)
, iterator_(std::move(i))
, sentinel_(std::move(s)) {}

template<typename R, std::enable_if_t<conjunction<
different_from<subrange, R>,
Expand Down Expand Up @@ -158,7 +163,6 @@ class subrange
return PairLike(iterator_, sentinel_);
}


template<typename I2 = I, std::enable_if_t<copyable<I2>::value, int> = 0>
constexpr I begin() const {
return iterator_;
Expand Down Expand Up @@ -240,8 +244,8 @@ class subrange
ranges::advance(iterator_, n, sentinel_);
}

I iterator_;
S sentinel_;
I iterator_{};
S sentinel_{};
};

// make-function for C++14
Expand Down
4 changes: 3 additions & 1 deletion include/preview/__ranges/views/as_const_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <utility>

#include "preview/__concepts/copy_constructible.h"
#include "preview/__concepts/default_initializable.h"
#include "preview/__ranges/cbegin.h"
#include "preview/__ranges/simple_view.h"
#include "preview/__ranges/enable_borrowed_range.h"
Expand All @@ -25,7 +26,8 @@ class as_const_view : public view_interface<as_const_view<V>> {
static_assert(view<V>::value, "Constraints not satisfied");
static_assert(input_range<V>::value, "Constraints not satisfied");

as_const_view() = default;
template<bool B = default_initializable<V>::value, std::enable_if_t<B, int> = 0>
constexpr as_const_view() {}

constexpr explicit as_const_view(V base)
: base_(std::move(base)) {}
Expand Down
4 changes: 3 additions & 1 deletion include/preview/__ranges/views/common_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <utility>

#include "preview/__concepts/copyable.h"
#include "preview/__concepts/default_initializable.h"
#include "preview/__iterator/common_iterator.h"
#include "preview/__ranges/borrowed_range.h"
#include "preview/__ranges/begin.h"
Expand All @@ -32,7 +33,8 @@ class common_view : public view_interface<common_view<V>> {
static_assert(common_range<V>::value == false, "Constraints not satisfied");
static_assert(copyable<iterator_t<V>>::value, "Constraints not satisfied");

common_view() = default;
template<bool B = default_initializable<V>::value, std::enable_if_t<B, int> = 0>
constexpr common_view() {}

constexpr explicit common_view(V r)
: base_(std::move(r)) {}
Expand Down
5 changes: 3 additions & 2 deletions include/preview/__ranges/views/concat_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <utility>

#include "preview/__core/inline_variable.h"
#include "preview/__concepts/default_initializable.h"
#include "preview/__iterator/next.h"
#include "preview/__ranges/common_range.h"
#include "preview/__ranges/simple_view.h"
Expand Down Expand Up @@ -375,8 +376,8 @@ struct concat_view : view_interface<concat_view<Rngs...>> {

};


concat_view() = default;
template<bool B = default_initializable<std::tuple<Rngs...>>::value, std::enable_if_t<B, int> = 0>
constexpr concat_view() {}

explicit concat_view(Rngs... rngs)
: bases_{std::move(rngs)...} {}
Expand Down
5 changes: 3 additions & 2 deletions include/preview/__ranges/views/drop_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <utility>

#include "preview/__concepts/copy_constructible.h"
#include "preview/__concepts/default_initializable.h"
#include "preview/__iterator/next.h"
#include "preview/__ranges/simple_view.h"
#include "preview/__ranges/begin.h"
Expand Down Expand Up @@ -68,12 +69,12 @@ class drop_view : public detail::drop_view_cached_begin<drop_view<V>, V> {
public:
static_assert(view<V>::value, "Constraints not satisfied");

drop_view() = default;
template<bool B = default_initializable<V>::value, std::enable_if_t<B, int> = 0>
constexpr drop_view() {}

constexpr explicit drop_view(V base, range_difference_t<V> count)
: base_(std::move(base)), count_(count) {}


template<typename Dummy = void, std::enable_if_t<conjunction<std::is_void<Dummy>,
copy_constructible<V>
>::value, int> = 0>
Expand Down
4 changes: 3 additions & 1 deletion include/preview/__ranges/views/drop_while_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#include "preview/__algorithm/ranges/find_if_not.h"
#include "preview/__concepts/copy_constructible.h"
#include "preview/__concepts/default_initializable.h"
#include "preview/__iterator/indirect_unary_predicate.h"
#include "preview/__ranges/enable_borrowed_range.h"
#include "preview/__ranges/end.h"
Expand Down Expand Up @@ -64,7 +65,8 @@ class drop_while_view
static_assert(std::is_object<Pred>::value, "Constraints not satisfied");
static_assert(indirect_unary_predicate<const Pred, iterator_t<V>>::value, "Constraints not satisfied");

drop_while_view() = default;
template<bool B = default_initializable<V>::value && default_initializable<Pred>::value, std::enable_if_t<B, int> = 0>
constexpr drop_while_view() {}

constexpr explicit drop_while_view(V base, Pred pred)
: base_(std::move(base)), pred_(std::move(pred)) {}
Expand Down
11 changes: 7 additions & 4 deletions include/preview/__ranges/views/elements_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include "preview/__concepts/copy_constructible.h"
#include "preview/__concepts/convertible_to.h"
#include "preview/__concepts/default_initializable.h"
#include "preview/__concepts/derived_from.h"
#include "preview/__concepts/move_constructible.h"
#include "preview/__iterator/detail/have_cxx20_iterator.h"
Expand Down Expand Up @@ -128,7 +129,8 @@ class elements_view : public view_interface<elements_view<V, N>> {
using reference = typename iterator_reference<range_reference_t<Base>>::type;
#endif

iterator() = default;
template<bool B = default_initializable<iterator_t<Base>>::value, std::enable_if_t<B, int> = 0>
constexpr iterator() {}

constexpr explicit iterator(iterator_t<Base> current)
: current_(std::move(current)) {}
Expand Down Expand Up @@ -261,7 +263,7 @@ class elements_view : public view_interface<elements_view<V, N>> {
return static_cast<E>(std::get<N>(*std::forward<T>(e)));
}

iterator_t<Base> current_;
iterator_t<Base> current_{};
};

template<bool Const>
Expand Down Expand Up @@ -347,7 +349,8 @@ class elements_view : public view_interface<elements_view<V, N>> {
sentinel_t<Base> end_;
};

elements_view() = default;
template<bool B = default_initializable<V>::value, std::enable_if_t<B, int> = 0>
constexpr elements_view() {}

constexpr explicit elements_view(V base)
: base_(std::move(base)) {}
Expand Down Expand Up @@ -413,7 +416,7 @@ class elements_view : public view_interface<elements_view<V, N>> {
}

private:
V base_;
V base_{};
};

} // namespace ranges
Expand Down
11 changes: 7 additions & 4 deletions include/preview/__ranges/views/enumerate_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#include "preview/__concepts/copy_constructible.h"
#include "preview/__concepts/convertible_to.h"
#include "preview/__concepts/default_initializable.h"
#include "preview/__concepts/move_constructible.h"
#include "preview/__iterator/iterator_tag.h"
#include "preview/__iterator/iter_move.h"
Expand Down Expand Up @@ -89,7 +90,8 @@ class enumerate_view : public view_interface<enumerate_view<V>> {
using pointer = void;
using reference = Tuple<difference_type, range_reference_t<Base>>;

iterator() = default;
template<bool B = default_initializable<iterator_t<Base>>::value, std::enable_if_t<B, int> = 0>
constexpr iterator() {}

template<bool AntiConst, std::enable_if_t<conjunction<
bool_constant<((Const != AntiConst) && Const)>,
Expand Down Expand Up @@ -227,8 +229,8 @@ class enumerate_view : public view_interface<enumerate_view<V>> {
}

private:
iterator_t<Base> current_;
difference_type pos_;
iterator_t<Base> current_{};
difference_type pos_ = 0;
};

template<bool Const>
Expand Down Expand Up @@ -299,7 +301,8 @@ class enumerate_view : public view_interface<enumerate_view<V>> {
sentinel_t<Base> end_;
};

enumerate_view() = default;
template<bool B = default_initializable<V>::value, std::enable_if_t<B, int> = 0>
constexpr enumerate_view() {}

constexpr explicit enumerate_view(V base)
: base_(std::move(base)) {}
Expand Down
10 changes: 7 additions & 3 deletions include/preview/__ranges/views/filter_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <utility>

#include "preview/__algorithm/ranges/find_if.h"
#include "preview/__concepts/default_initializable.h"
#include "preview/__concepts/derived_from.h"
#include "preview/__concepts/equality_comparable.h"
#include "preview/__core/std_version.h"
Expand Down Expand Up @@ -142,7 +143,8 @@ class filter_view : public view_interface<filter_view<V, Pred>>, detail::filter_
using reference = range_reference_t<V>;
#endif

iterator() = default;
template<bool B = default_initializable<iterator_t<V>>::value, std::enable_if_t<B, int> = 0>
constexpr iterator() {}

constexpr iterator(filter_view& parent, iterator_t<V> current)
: current_(std::move(current))
Expand Down Expand Up @@ -265,10 +267,12 @@ class filter_view : public view_interface<filter_view<V, Pred>>, detail::filter_

friend class iterator;

filter_view() = default;
template<bool B = default_initializable<V>::value && default_initializable<Pred>::value, std::enable_if_t<B, int> = 0>
constexpr filter_view() {}

constexpr explicit filter_view(V base, Pred pred)
: base_(std::move(base)), pred_(std::move(pred)) {}
: base_(std::move(base))
, pred_(std::move(pred)) {}

template<typename V2 = V, std::enable_if_t<copy_constructible<V2>::value, int> = 0>
constexpr V base() const & {
Expand Down
Loading

0 comments on commit 7224079

Please sign in to comment.