00001 /* $Id: cmd_helper.h 23742 2012-01-03 21:58:26Z rubidium $ */ 00002 00003 /* 00004 * This file is part of OpenTTD. 00005 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. 00006 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00007 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>. 00008 */ 00009 00012 #ifndef CMD_HELPER_H 00013 #define CMD_HELPER_H 00014 00015 #include "core/enum_type.hpp" 00016 #include "core/bitmath_func.hpp" 00017 00026 template<typename T, uint S, uint N, typename U> static inline T Extract(U v) 00027 { 00028 /* Check if there are enough bits in v */ 00029 assert_tcompile(N == EnumPropsT<T>::num_bits); 00030 assert_tcompile(S + N <= sizeof(U) * 8); 00031 assert_tcompile(EnumPropsT<T>::end <= (1 << N)); 00032 U masked = GB(v, S, N); 00033 return IsInsideMM(masked, EnumPropsT<T>::begin, EnumPropsT<T>::end) ? (T)masked : EnumPropsT<T>::invalid; 00034 } 00035 00036 #endif /* CMD_HELPER_H */