meta::weakly_incrementable

Defined in header <mgs/meta/concepts/weakly_incrementable.hpp>.

template <typename I>
concept weakly_incrementable =
  meta::semiregular<I> &&
  requires(I i) {
    typename meta::iter_difference_t<I>;
    requires meta::signed_integral<meta::iter_difference_t<I>>;
    { ++i } -> meta::same_as<I&>;
    i++;
  };

Pre-C++20 implementation of the std::weakly_incrementable concept.


Concept emulation

namespace mgs {
namespace meta {

template <typename I>
struct is_weakly_incrementable { /* ... */ };

template <typename I>
constexpr auto is_weakly_incrementable_v = is_weakly_incrementable<I>::value;

template <typename I,
          typename = std::enable_if_t<is_weakly_incrementable_v<I>>>
using weakly_incrementable = I;

} // namespace meta
} // namespace mgs

Example

#include <mgs/meta/concepts/weakly_incrementable.hpp>

using namespace mgs::meta;

struct dummy_weakly_incrementable {
  using difference_type = std::ptrdiff_t;

  dummy_weakly_incrementable& operator++();
  dummy_weakly_incrementable operator++(int);
};

static_assert(is_weakly_incrementable_v<int>, "");
static_assert(is_weakly_incrementable_v<dummy_weakly_incrementable>, "");