#ifndef RUST_CXX_ENUMEXT_MACROS_H
#define RUST_CXX_ENUMEXT_MACROS_H
#include "rust/cxx_enumext.h"
namespace rust {
namespace enm {
namespace detail {
struct MoveType {
MoveType() = default;
MoveType(MoveType &&other) = default;
MoveType(const MoveType &other) = delete;
MoveType &operator=(const MoveType &other) = delete;
MoveType &operator=(MoveType &&other) = default;
};
struct CopyType {
CopyType() = default;
CopyType(const CopyType &other) = default;
CopyType(CopyType &&other) = delete;
CopyType(int, std::string) {}
CopyType &operator=(const CopyType &other) = default;
CopyType &operator=(CopyType &&other) = delete;
};
struct CopyAndMoveType {
CopyAndMoveType() = default;
CopyAndMoveType(const CopyAndMoveType &other) = default;
CopyAndMoveType(CopyAndMoveType &&other) = default;
CopyAndMoveType &operator=(const CopyAndMoveType &other) = default;
CopyAndMoveType &operator=(CopyAndMoveType &&other) = default;
};
struct NoCopyAndNoMoveType {
NoCopyAndNoMoveType() = default;
NoCopyAndNoMoveType(const NoCopyAndNoMoveType &other) = delete;
NoCopyAndNoMoveType(NoCopyAndNoMoveType &&other) = delete;
NoCopyAndNoMoveType &operator=(const NoCopyAndNoMoveType &other) = delete;
NoCopyAndNoMoveType &operator=(NoCopyAndNoMoveType &&other) = delete;
};
using all_variant =
variant<MoveType, CopyType, CopyAndMoveType, NoCopyAndNoMoveType>;
static_assert(!std::is_default_constructible_v<all_variant>);
static_assert(!std::is_constructible_v<all_variant, all_variant &&>);
static_assert(!std::is_constructible_v<all_variant, const all_variant &>);
static_assert(!std::is_copy_assignable_v<all_variant>);
static_assert(!std::is_move_assignable_v<all_variant>);
static_assert(std::is_constructible_v<all_variant, MoveType>);
static_assert(std::is_constructible_v<all_variant, MoveType &&>);
static_assert(!std::is_constructible_v<all_variant, MoveType &>);
static_assert(!std::is_constructible_v<all_variant, const MoveType &>);
static_assert(
std::is_constructible_v<all_variant, std::in_place_type_t<MoveType>>);
static_assert(std::is_constructible_v<all_variant, std::in_place_index_t<0>>);
static_assert(!std::is_constructible_v<all_variant, CopyType>);
static_assert(!std::is_constructible_v<all_variant, CopyType &&>);
static_assert(std::is_constructible_v<all_variant, CopyType &>);
static_assert(std::is_constructible_v<all_variant, const CopyType &>);
static_assert(
std::is_constructible_v<all_variant, std::in_place_type_t<CopyType>>);
static_assert(std::is_constructible_v<
all_variant, std::in_place_type_t<CopyType>, int, std::string>);
static_assert(std::is_constructible_v<all_variant, std::in_place_index_t<1>>);
static_assert(std::is_constructible_v<all_variant, CopyAndMoveType>);
static_assert(std::is_constructible_v<all_variant, CopyAndMoveType &&>);
static_assert(std::is_constructible_v<all_variant, CopyAndMoveType &>);
static_assert(std::is_constructible_v<all_variant, const CopyAndMoveType &>);
static_assert(std::is_constructible_v<all_variant,
std::in_place_type_t<CopyAndMoveType>>);
static_assert(std::is_constructible_v<all_variant, std::in_place_index_t<2>>);
static_assert(!std::is_constructible_v<all_variant, NoCopyAndNoMoveType>);
static_assert(!std::is_constructible_v<all_variant, NoCopyAndNoMoveType &&>);
static_assert(!std::is_constructible_v<all_variant, NoCopyAndNoMoveType &>);
static_assert(
!std::is_constructible_v<all_variant, const NoCopyAndNoMoveType &>);
static_assert(std::is_constructible_v<
all_variant, std::in_place_type_t<NoCopyAndNoMoveType>>);
static_assert(std::is_constructible_v<all_variant, std::in_place_index_t<3>>);
static_assert(!std::is_constructible_v<all_variant, std::in_place_index_t<4>>);
static_assert(!std::is_constructible_v<all_variant, std::in_place_type_t<int>>);
using std_all_variant =
std::variant<MoveType, CopyType, CopyAndMoveType, NoCopyAndNoMoveType>;
static_assert(!std::is_constructible_v<all_variant, const std_all_variant &>);
static_assert(!std::is_constructible_v<all_variant, std_all_variant &&>);
static_assert(!std::is_assignable_v<all_variant, const std_all_variant &>);
static_assert(!std::is_assignable_v<all_variant, std_all_variant &&>);
using move_variant = variant<MoveType, CopyAndMoveType>;
static_assert(!std::is_default_constructible_v<move_variant>);
static_assert(!std::is_constructible_v<move_variant, move_variant &&>);
static_assert(!std::is_constructible_v<move_variant, const move_variant &>);
static_assert(!std::is_copy_assignable_v<move_variant>);
static_assert(!std::is_move_assignable_v<move_variant>);
using std_move_variant = std::variant<MoveType, CopyAndMoveType>;
static_assert(!std::is_constructible_v<move_variant, const std_move_variant &>);
static_assert(std::is_constructible_v<move_variant, std_move_variant &&>);
static_assert(!std::is_assignable_v<move_variant, const std_move_variant &>);
static_assert(std::is_assignable_v<move_variant, std_move_variant &&>);
using copy_variant = variant<CopyType, CopyAndMoveType>;
static_assert(!std::is_default_constructible_v<copy_variant>);
static_assert(!std::is_constructible_v<copy_variant, copy_variant &&>);
static_assert(std::is_constructible_v<copy_variant, const copy_variant &>);
static_assert(std::is_copy_assignable_v<copy_variant>);
static_assert(!std::is_move_assignable_v<copy_variant>);
using std_copy_variant = std::variant<CopyType, CopyAndMoveType>;
static_assert(std::is_constructible_v<copy_variant, const std_copy_variant &>);
static_assert(std::is_constructible_v<copy_variant, std_copy_variant &&>);
static_assert(std::is_assignable_v<copy_variant, const std_copy_variant &>);
static_assert(std::is_assignable_v<copy_variant, std_copy_variant &&>);
using duplicate_variant = variant<int, int>;
static_assert(!std::is_constructible_v<duplicate_variant, int>);
static_assert(!std::is_constructible_v<duplicate_variant,
std::in_place_type_t<int>, int>);
static_assert(
std::is_constructible_v<duplicate_variant, std::in_place_index_t<0>, int>);
static_assert(
std::is_constructible_v<duplicate_variant, std::in_place_index_t<1>, int>);
static_assert(
!std::is_constructible_v<duplicate_variant, std::in_place_index_t<2>, int>);
static_assert(sizeof(std::reference_wrapper<all_variant>) ==
sizeof(std::ptrdiff_t));
template <std::size_t I>
using copy_variant_alternative_t =
variant_alternative_t<I, CopyType, CopyAndMoveType>;
static_assert(std::is_same_v<decltype(get<0>(std::declval<copy_variant>())),
const copy_variant_alternative_t<0> &>);
static_assert(std::is_same_v<decltype(get<1>(std::declval<copy_variant>())),
const copy_variant_alternative_t<1> &>);
static_assert(sizeof(monostate) == sizeof(std::uint8_t));
enum a_enum { AA };
static_assert(sizeof(std::underlying_type_t<a_enum>) == sizeof(int));
}
} }
#endif