25 #ifndef INCLUDED_MatrixConventions_h_GUID_82404AE2_0D13_46A4_4618_05AD5A20D7EA 
   26 #define INCLUDED_MatrixConventions_h_GUID_82404AE2_0D13_46A4_4618_05AD5A20D7EA 
   36 #include <type_traits> 
   42         enum class CompactMatrixFlags {
 
   53             const bool rowmaj(0 != (flags & OSVR_MATRIX_MASK_ROWMAJOR));
 
   54             const bool rowvec(0 != (flags & OSVR_MATRIX_MASK_ROWVECTORS));
 
   57             return (rowmaj ^ rowvec);
 
   64                 if (matrixNeedsTranspose(flags)) {
 
   65                     set(CompactMatrixFlags::NeedsTranspose);
 
   68                 if (0 != (flags & OSVR_MATRIX_MASK_LHINPUT)) {
 
   69                     set(CompactMatrixFlags::LeftHandInput);
 
   72                 if (0 != (flags & OSVR_MATRIX_MASK_UNSIGNEDZ)) {
 
   73                     set(CompactMatrixFlags::UnsignedZ);
 
   76             template <
typename... Args>
 
   82             bool operator[](CompactMatrixFlags flag)
 const {
 
   83                 return m_data[
static_cast<std::size_t
>(flag)];
 
   86             unsigned long getValue()
 const { 
return m_data.to_ulong(); }
 
   88             void set(CompactMatrixFlags flag) {
 
   89                 m_data.set(static_cast<std::size_t>(flag));
 
   92             template <
typename... Args>
 
   93             void set(CompactMatrixFlags flag, Args... args) {
 
  100             static const std::size_t SIZE =
 
  101                 static_cast<std::size_t
>(CompactMatrixFlags::SIZEPLUSONE) - 1;
 
  102             std::bitset<SIZE> m_data;
 
  104             template <CompactMatrixFlags Flag>
 
  106                 std::integral_constant<std::size_t,
 
  107                                        (0x1 << 
static_cast<std::size_t
>(
Flag))>;
 
  110             template <std::size_t State, CompactMatrixFlags... MyFlags>
 
  111             struct ComputeBitsImpl;
 
  113             template <std::
size_t State>
 
  114             struct ComputeBitsImpl<State>
 
  115                 : std::integral_constant<std::size_t, State> {};
 
  117             template <std::size_t State, CompactMatrixFlags 
Flag,
 
  118                       CompactMatrixFlags... MyFlags>
 
  119             struct ComputeBitsImpl<State, Flag, MyFlags...>
 
  120                 : ComputeBitsImpl<(State | FlagToMask<Flag>::value),
 
  124             template <CompactMatrixFlags... MyFlags>
 
  125             using ComputeBits = ComputeBitsImpl<0, MyFlags...>;
 
  131 #endif // INCLUDED_MatrixConventions_h_GUID_82404AE2_0D13_46A4_4618_05AD5A20D7EA 
uint16_t OSVR_MatrixConventions
Type for passing matrix convention flags. 
A class that lightly wraps a bool, in order to provide easier maintenance of a "dirty" flag...