Shrink menu_bit_wrapper_t when B is empty

This commit is contained in:
Kp 2015-10-09 02:46:11 +00:00
parent 927618e650
commit a47c6e599d
2 changed files with 28 additions and 9 deletions

View file

@ -31,6 +31,8 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#include <cstdint>
#include <algorithm>
#include <memory>
#include <tuple>
#include <utility>
#include "varutil.h"
#include "dxxsconf.h"
#include "fmtcheck.h"
@ -446,23 +448,40 @@ static inline void nm_set_item_slider(newmenu_item &ni, const char *text, unsign
template <typename T, typename B>
class menu_bit_wrapper_t
{
T &m_mask;
B m_bit;
using M = decltype(std::declval<const T &>() & std::declval<B>());
std::tuple<T &, B> m_data;
enum
{
m_mask = 0,
m_bit = 1,
};
T &get_mask()
{
return std::get<m_mask>(m_data);
}
const T &get_mask() const
{
return std::get<m_mask>(m_data);
}
B get_bit() const
{
return std::get<m_bit>(m_data);
}
public:
constexpr menu_bit_wrapper_t(T &t, B bit) :
m_mask(t), m_bit(bit)
m_data(t, bit)
{
}
constexpr operator T() const
constexpr operator M() const
{
return m_mask & m_bit;
return get_mask() & get_bit();
}
menu_bit_wrapper_t &operator=(bool n)
{
if (n)
m_mask |= m_bit;
get_mask() |= get_bit();
else
m_mask &= ~m_bit;
get_mask() &= ~get_bit();
return *this;
}
};

View file

@ -1738,7 +1738,7 @@ public:
}
};
class cheat_menu_bit_invulnerability : public menu_bit_wrapper_t<uint32_t, uint32_t>
class cheat_menu_bit_invulnerability : public menu_bit_wrapper_t<uint32_t, decltype(PLAYER_FLAGS_INVULNERABLE)>
{
player &m_player;
public:
@ -1758,7 +1758,7 @@ public:
}
};
class cheat_menu_bit_cloak : public menu_bit_wrapper_t<uint32_t, uint32_t>
class cheat_menu_bit_cloak : public menu_bit_wrapper_t<uint32_t, decltype(PLAYER_FLAGS_CLOAKED)>
{
player &m_player;
public: