A modded EditSaber for making beat saber maps.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

193 lines
3.3 KiB

#pragma once
//
// ###### To create an enum call MyType with string support: ######
//
//// MyType.h
//struct MyType
//{
// enum _Enum
// {
// Unknown,
// Foo,
// Bar
// };
//
// struct _Definition : public EnumerationDefinition< _Enum, _Definition > { static StringValue Strings[]; };
// typedef EnumerationValue< _Enum, _Definition, Unknown > _Value;
//};
//
//typedef MyType::_Value MyTypeEnum;
//
//
//// MyType.cpp
//#include "MyType.h"
//
//MyType::_Definition::StringValue MyType::_Definition::Strings[] =
//{
// { MyType::Foo, _T( "Foo" ) },
// { MyType::Bar, _T( "Bar" ) },
// { MyType::Unknown, NULL }
//};
//
//
// ###### To create an enum call MyType without string support: ######
//
//// MyType.h
//struct MyType
//{
// enum _Enum
// {
// Unknown,
// Foo,
// Bar
// };
//
// typedef EnumerationDefinitionNoStrings _Definition;
// typedef EnumerationValue< _Enum, _Definition, Unknown > _Value;
//};
//
//typedef MyType::_Value MyTypeEnum;
//
namespace SevenZip
{
namespace intl
{
template < typename TEnum, class DerivedDef >
struct EnumerationDefinition
{
struct StringValue
{
TEnum value;
const TCHAR* string;
};
static TEnum Parse( const TString& string, const TEnum defaultValue )
{
const StringValue* it = DerivedDef::Strings;
for (; it->string != NULL; ++it )
{
if ( string.Compare( it->string ) == 0 )
{
return it->value;
}
}
return defaultValue;
}
static TString Format( const TEnum& value )
{
const StringValue* it = DerivedDef::Strings;
for (; it->string != NULL; ++it )
{
if ( value == it->value )
{
return it->string;
}
}
return TString();
}
};
struct EnumerationDefinitionNoStrings {};
template < typename TEnum, class TEnumClass, TEnum DefaultValue >
class EnumerationValue
{
private:
typedef typename EnumerationValue< TEnum, TEnumClass, DefaultValue > ThisClass;
TEnum m_value;
public:
typedef typename TEnum Enum;
EnumerationValue():
m_value( DefaultValue )
{}
EnumerationValue( const TEnum& value ):
m_value( value )
{}
static ThisClass Parse( const TString& string )
{
return ThisClass( TEnumClass::Parse( string, DefaultValue ) );
}
const TEnum& GetValue() const
{
return m_value;
}
TString GetString() const
{
return TEnumClass::Format( m_value );
}
operator TEnum() const
{
return m_value;
}
ThisClass& operator=( const TEnum& value )
{
m_value = value;
return *this;
}
bool operator==( const ThisClass& that ) const
{
return that.m_value == m_value;
}
bool operator!=( const ThisClass& that ) const
{
return !operator==( that );
}
bool operator==( const TEnum& value ) const
{
return value == m_value;
}
bool operator!=( const TEnum& value ) const
{
return !operator==( value );
}
bool operator< ( const ThisClass& that ) const
{
return m_value < that.m_value;
}
// Bit field members
void AddFlag( const TEnum& value )
{
*reinterpret_cast< int* >( &m_value ) |= static_cast< int >( value );
}
void RemoveFlag( const TEnum& value )
{
*reinterpret_cast< int* >( &m_value ) &= ~static_cast< int >( value );
}
bool HasFlag( const TEnum& value ) const
{
return ( m_value & value ) == value;
}
bool HasAnyFlag( const TEnum& valueCombo ) const
{
return ( m_value & valueCombo ) != 0;
}
};
}
}