library of assembled shared sources |
http://lass.cocamware.com |
00001 /** @file 00002 * @author Bram de Greve (bramz@users.sourceforge.net) 00003 * @author Tom De Muer (tomdemuer@users.sourceforge.net) 00004 * 00005 * *** BEGIN LICENSE INFORMATION *** 00006 * 00007 * The contents of this file are subject to the Common Public Attribution License 00008 * Version 1.0 (the "License"); you may not use this file except in compliance with 00009 * the License. You may obtain a copy of the License at 00010 * http://lass.sourceforge.net/cpal-license. The License is based on the 00011 * Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover 00012 * use of software over a computer network and provide for limited attribution for 00013 * the Original Developer. In addition, Exhibit A has been modified to be consistent 00014 * with Exhibit B. 00015 * 00016 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT 00017 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific 00018 * language governing rights and limitations under the License. 00019 * 00020 * The Original Code is LASS - Library of Assembled Shared Sources. 00021 * 00022 * The Initial Developer of the Original Code is Bram de Greve and Tom De Muer. 00023 * The Original Developer is the Initial Developer. 00024 * 00025 * All portions of the code written by the Initial Developer are: 00026 * Copyright (C) 2004-2007 the Initial Developer. 00027 * All Rights Reserved. 00028 * 00029 * Contributor(s): 00030 * 00031 * Alternatively, the contents of this file may be used under the terms of the 00032 * GNU General Public License Version 2 or later (the GPL), in which case the 00033 * provisions of GPL are applicable instead of those above. If you wish to allow use 00034 * of your version of this file only under the terms of the GPL and not to allow 00035 * others to use your version of this file under the CPAL, indicate your decision by 00036 * deleting the provisions above and replace them with the notice and other 00037 * provisions required by the GPL License. If you do not delete the provisions above, 00038 * a recipient may use your version of this file under either the CPAL or the GPL. 00039 * 00040 * *** END LICENSE INFORMATION *** 00041 */ 00042 00043 /** @defgroup BitManip BitManip 00044 * @brief A set of simple bit manipulation functions. 00045 * @author Bram de Greve 00046 * @date 2003 00047 * 00048 * This module groups simple bit manipulation functions you can use on bitfields. These bitfields 00049 * can be of any type for which the bit operators like &=, |=, ... are defined. Typically, you'll 00050 * use @c int, @c char, @c unsigned, ... 00051 * 00052 * The functions are split in two groups. The @e bit routines (with the word @c Bit in their 00053 * names :) and the @e mask routines (with the word @c Mask). The groups are very alike, except in 00054 * the way you address the bits to affect. With the @e bit group you will address one single bit 00055 * at one time, and you will indicate it by its index in the bit field (i.e. bit 0 is 0x01, bit 1 00056 * is 0x02, bit 2 is 0x04, ...). With the @e mask group, you can address multiple bits at once by 00057 * setting these bits in the mask (e.g. to address bits 0 and 2, you'll use 0x05 as mask). These 00058 * mask must be of the same type of the bitfield. 00059 * 00060 * With the routines you can set bits to 1; clear bits to 0; flip bits (0 becomes 1, 1 becomes 0); 00061 * set, clear or flip bits if a condition is fullfilled; set a bit to a given value (0 or 1); 00062 * check if a bit is set. For all these operations you'll find a function in both the @c bit group 00063 * as in the @c mask group, except for the last operation: to check if a bit is set. In the @c bit 00064 * group you'll find one function checkBit which will return true if the addressed bit is set. 00065 * In the @c mask group you'll find two: checkMaskedAll and checkMaskedSome. the former only 00066 * returns true if @e all bits addressed by the mask are set (an @e and operation), the latter 00067 * already returns true if at least @e some of the addressed bits are set (an @e or operation). 00068 */ 00069 00070 00071 #ifndef LASS_GUARDIAN_OF_INCLUSION_UTIL_BIT_MANIP_H 00072 #define LASS_GUARDIAN_OF_INCLUSION_UTIL_BIT_MANIP_H 00073 00074 00075 #include "util_common.h" 00076 #include "../num/basic_types.h" 00077 00078 namespace lass 00079 { 00080 00081 namespace util 00082 { 00083 00084 template<typename T> inline void setBit(T& a_bits, unsigned a_bit); 00085 template<typename T> inline void clearBit(T& a_bits, unsigned a_bit); 00086 template<typename T> inline void flipBit(T& a_bits, unsigned a_bit); 00087 template<typename T> inline void setBitIf(T& a_bits, unsigned a_bit, bool a_condition); 00088 template<typename T> inline void clearBitIf(T& a_bits, unsigned a_bit, bool a_condition); 00089 template<typename T> inline void flipBitIf(T& a_bits, unsigned a_bit, bool a_condition); 00090 template<typename T> inline void setBitTo(T& a_bits, unsigned a_bit, bool a_state); 00091 template<typename T> inline bool checkBit(T a_bits, unsigned a_bit); 00092 00093 template<typename T> inline void setMasked(T& a_bits, const T& a_mask); 00094 template<typename T> inline void clearMasked(T& a_bits, const T& a_mask); 00095 template<typename T> inline void flipMasked(T& a_bits, const T& a_mask); 00096 template<typename T> inline void setMaskedIf(T& a_bits, const T& a_mask, bool a_condition); 00097 template<typename T> inline void clearMaskedIf(T& a_bits, const T& a_mask, bool a_condition); 00098 template<typename T> inline void flipMaskedIf(T& a_bits, const T& a_mask, bool a_condition); 00099 template<typename T> inline void setMaskedTo(T& a_bits, const T& a_mask, bool a_state); 00100 template<typename T> inline bool checkMaskedAll(T a_bits, const T& a_mask); 00101 template<typename T> inline bool checkMaskedSome(T a_bits, const T& a_mask); 00102 00103 template<typename T> inline const size_t countBits(T bits); 00104 00105 /* 00106 inline const unsigned countBits(num::Tuint8 x); 00107 inline const unsigned countBits(num::Tint8 x); 00108 inline const unsigned countBits(num::Tuint16 x); 00109 inline const unsigned countBits(num::Tint16 x); 00110 inline const unsigned countBits(num::Tuint32 x); 00111 inline const unsigned countBits(num::Tint32 x); 00112 inline const unsigned countBits(num::Tuint64 x); 00113 inline const unsigned countBits(num::Tint64 x); 00114 */ 00115 00116 } 00117 00118 } 00119 00120 #include "bit_manip.inl" 00121 00122 #endif
Generated on Mon Nov 10 14:20:00 2008 for Library of Assembled Shared Sources by 1.5.7.1 |