#ifndef _PAPILO_MISC_FLAGS_HPP_
#define _PAPILO_MISC_FLAGS_HPP_
#include <cstdint>
#include <type_traits>
namespace papilo
{
template <typename BaseType>
class Flags
{
public:
Flags( BaseType t ) : state( static_cast<UnderlyingType>( t ) ) {}
Flags() : state( 0 ) {}
template <typename... Args>
void
set( Args... flags )
{
state |= joinFlags( flags... );
}
void
clear()
{
state = 0;
}
template <typename... Args>
void
unset( Args... flags )
{
state &= ~joinFlags( flags... );
}
template <typename... Args>
bool
test( Args... flags ) const
{
return state & joinFlags( flags... );
}
template <typename... Args>
bool
equal( Args... flags ) const
{
return state == joinFlags( flags... );
}
template <typename Archive>
void
serialize( Archive& ar, const unsigned int version )
{
ar& state;
}
private:
using UnderlyingType = typename std::underlying_type<BaseType>::type;
static UnderlyingType
joinFlags( BaseType f1 )
{
return static_cast<UnderlyingType>( f1 );
}
template <typename... Args>
static UnderlyingType
joinFlags( BaseType f1, Args... other )
{
return static_cast<UnderlyingType>( f1 ) | joinFlags( other... );
}
UnderlyingType state;
};
}
#endif