CMS 3D CMS Logo

BitPattern.h

Go to the documentation of this file.
00001 #ifndef CLASSLIB_BIT_PATTERN_H
00002 # define CLASSLIB_BIT_PATTERN_H
00003 
00004 //<<<<<< INCLUDES                                                       >>>>>>
00005 
00006 # include "classlib/sysapi/system.h"
00007 
00008 namespace lat {
00009 //<<<<<< PUBLIC DEFINES                                                 >>>>>>
00010 //<<<<<< PUBLIC CONSTANTS                                               >>>>>>
00011 //<<<<<< PUBLIC TYPES                                                   >>>>>>
00012 //<<<<<< PUBLIC VARIABLES                                               >>>>>>
00013 //<<<<<< PUBLIC FUNCTIONS                                               >>>>>>
00014 //<<<<<< CLASS DECLARATIONS                                             >>>>>>
00015 
00016 // This should all be partial template specialisation with <Pat,Width,[01]>,
00017 // but MSVC++ doesn't grok it.  So make a wrapper with the parameter we want
00018 // to specialise (N), and specialise on that.
00019 template <unsigned int N>
00020 struct BitPatternHelp
00021 {
00022     template <class T, unsigned int Pat, unsigned int Width>
00023     struct PatWrapper
00024     {
00025         enum { Pattern = (((T) BitPatternHelp<N/2+N%2>::template PatWrapper<T,Pat,Width>::Pattern
00026                            << (T) (Width*(N/2)))
00027                           | (T) BitPatternHelp<N/2>::template PatWrapper<T,Pat,Width>::Pattern) };
00028     };
00029 };
00030 
00032 template <>
00033 struct BitPatternHelp<0>
00034 {
00035     template <class T, unsigned int Pat, unsigned int Width>
00036     struct PatWrapper
00037     {
00038         enum { Pattern = (T) 0 };
00039     };
00040 };
00041 
00043 template <>
00044 struct BitPatternHelp<1>
00045 {
00046     template <class T, unsigned int Pat, unsigned int Width>
00047     struct PatWrapper
00048     {
00049         enum { Pattern = (T) Pat };
00050     };
00051 };
00052 
00060 template <class T, unsigned int Pat, unsigned int Width, unsigned int N>
00061 struct BitPattern
00062 {
00063     enum { Pattern = BitPatternHelp<N>::template PatWrapper<T,Pat,Width>::Pattern };
00064 };
00065 
00066 //<<<<<< INLINE PUBLIC FUNCTIONS                                        >>>>>>
00067 //<<<<<< INLINE MEMBER FUNCTIONS                                        >>>>>>
00068 
00069 } // namespace lat
00070 #endif // CLASSLIB_BIT_PATTERN_H

Generated on Tue Jun 9 17:38:54 2009 for CMSSW by  doxygen 1.5.4