![]() |
![]() |
00001 #ifndef HLTReco_HLTResult_h 00002 #define HLTReco_HLTResult_h 00003 #include <boost/static_assert.hpp> 00004 #include <algorithm> 00005 00006 namespace reco { 00007 00008 namespace hlt { 00009 00010 template<unsigned int numberOfBits, typename word = unsigned short> 00011 struct wordConstants { 00012 enum { 00013 bytesInAWord = sizeof( word ), 00014 numberOfWords = 1 + ( numberOfBits - 1 ) / bytesInAWord 00015 }; 00016 }; 00017 00018 template<unsigned short i, typename W> 00019 struct mask { 00020 enum { 00021 wordOffset = i / W::numberOfWords, 00022 bitOffset = i % W::numberOfWords, 00023 value = mask<bitOffset - 1, W>::value << 1 00024 }; 00025 }; 00026 00027 template<typename W> 00028 struct mask<0, W> { 00029 enum { 00030 wordOffset = 0, 00031 bitOffset = 0, 00032 value = 1 00033 }; 00034 }; 00035 00036 } 00037 00038 template<unsigned int numberOfBits, typename word = unsigned short> 00039 class HLTResult { 00040 BOOST_STATIC_ASSERT( numberOfBits > 0 ); 00041 public: 00042 HLTResult() { std::fill( words_, words_ + size, 0 ); } 00043 HLTResult( word w[] ) { std::copy( w, w + size, words_ ); } 00044 public: 00045 template<unsigned short i> 00046 bool match() const { 00047 typedef hlt::mask<i, wordConstants> mask; 00048 return words_[ mask::wordOffset ] & mask::value; 00049 } 00050 template<unsigned short i> 00051 void set() { 00052 typedef hlt::mask<i, wordConstants> mask; 00053 words_[ mask::wordOffset ] |= mask::value; 00054 } 00055 template<unsigned short i> 00056 void unSet() { 00057 typedef hlt::mask<i, wordConstants> mask; 00058 words_[ mask::wordOffset ] &= ! mask::value; 00059 } 00060 00061 private: 00062 typedef hlt::wordConstants<numberOfBits, word> wordConstants; 00063 enum { wordSize = sizeof( word ), size = 1 + ( numberOfBits - 1 ) / wordSize }; 00064 word words_[ size ]; 00065 }; 00066 00067 } 00068 00069 #endif