This documentation is automatically generated by competitive-verifier/competitive-verifier
#include "tools/is_group.hpp"
template <typename G>
struct is_group {
static constexpr bool value;
};
template <typename G>
inline constexpr bool is_group_v = is_group<G>::value;
If <G>
satisfies the following conditions, tools::is_group<G>::value
is true
.
typename G::T
exists.typename G::T G::op(typename G::T, typename G::T)
exists.typename G::T G::e()
exists.typename G::T G::inv(typename G::T)
exists.Otherwise, it is false
.
#ifndef TOOLS_IS_GROUP_HPP
#define TOOLS_IS_GROUP_HPP
#include <type_traits>
#include <utility>
namespace tools {
template <typename G, typename = void>
struct is_group : ::std::false_type {};
template <typename G>
struct is_group<G, ::std::enable_if_t<
::std::is_same_v<typename G::T, decltype(G::op(::std::declval<typename G::T>(), ::std::declval<typename G::T>()))> &&
::std::is_same_v<typename G::T, decltype(G::e())> &&
::std::is_same_v<typename G::T, decltype(G::inv(::std::declval<typename G::T>()))>
, void>> : ::std::true_type {};
template <typename G>
inline constexpr bool is_group_v = ::tools::is_group<G>::value;
}
#endif
#line 1 "tools/is_group.hpp"
#include <type_traits>
#include <utility>
namespace tools {
template <typename G, typename = void>
struct is_group : ::std::false_type {};
template <typename G>
struct is_group<G, ::std::enable_if_t<
::std::is_same_v<typename G::T, decltype(G::op(::std::declval<typename G::T>(), ::std::declval<typename G::T>()))> &&
::std::is_same_v<typename G::T, decltype(G::e())> &&
::std::is_same_v<typename G::T, decltype(G::inv(::std::declval<typename G::T>()))>
, void>> : ::std::true_type {};
template <typename G>
inline constexpr bool is_group_v = ::tools::is_group<G>::value;
}