#ifndef BIT_MAN_H #define BIT_MAN_H /* Copyright (c) 2015-2015 Cisco Systems, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ template inline T btGetShift(unsigned int stopbit){ return(T)((sizeof(T)*8)-stopbit-1); } //this function return mask with 1 from the start bit // 0 in this bit are the MSB - big edian mode // if T is int (32) bit 31 is the last template inline T btGetMask(unsigned int startbit, unsigned int stopbit){ register T shft=btGetShift(stopbit); return ((T)( (((1<<(stopbit-startbit+1))-1)< inline T btGetMaskBitBigE(T a, int startbit, int stopbit ) { if((sizeof(T) * 8) == (stopbit - startbit + 1))// the case where the mask is the whole data { return a; } else { register T mask=btGetMask(startbit,stopbit); register T shift=btGetShift(stopbit); T result; result=((a & mask) >>shift); return(result); } } inline uint32_t btGetMaskBitBigE32(uint32_t a, int startbit, int stopbit ) { return(btGetMaskBitBigE(a,startbit,stopbit)); } inline unsigned short btGetMaskBitBigE16(uint16_t a, int startbit, int stopbit ) { return(btGetMaskBitBigE(a,startbit,stopbit)); } inline uint8_t btGetMaskBitBigE8(uint8_t a, int startbit, int stopbit ) { return(btGetMaskBitBigE(a,startbit,stopbit)); } template inline void btSetMaskBitBigE(T & a, int startbit, int stopbit, T newval) { if((sizeof(T) * 8) == (stopbit - startbit + 1))// the case where the mask is the whole data { a = newval; } else { register T mask=btGetMask(startbit,stopbit); register T shift=btGetShift(stopbit); a=((a & ~mask) | ( (newval <(a,startbit,stopbit,newVal); } inline void btSetMaskBitBigE16(uint16_t & a, int startbit, int stopbit, uint16_t newVal ) { btSetMaskBitBigE(a,startbit,stopbit,newVal); } inline void btSetMaskBitBigE8(uint8_t & a, int startbit, int stopbit, uint8_t newVal ) { btSetMaskBitBigE(a,startbit,stopbit,newVal); } template inline T btGetMaskBit(T a, int startbit, int stopbit ) { return(btGetMaskBitBigE(a,(sizeof(T)*8)-1-startbit,(sizeof(T)*8)-1-stopbit)); } template inline void btSetMaskBit(T & a, int startbit, int stopbit, T newval) { btSetMaskBitBigE(a,(sizeof(T)*8)-1-startbit,((sizeof(T)*8)-1-stopbit),newval); } inline unsigned int btGetMaskBit32(unsigned int a, int startbit, int stopbit ) { return(btGetMaskBit(a,startbit,stopbit)); } inline unsigned short btGetMaskBit16(unsigned short a, int startbit, int stopbit ) { return(btGetMaskBit(a,startbit,stopbit)); } inline uint8_t btGetMaskBit8(uint8_t a, int startbit, int stopbit ) { return(btGetMaskBit(a,startbit,stopbit)); } inline void btSetMaskBit32(unsigned int & a, int startbit, int stopbit, unsigned int newVal ) { btSetMaskBit(a,startbit,stopbit,newVal); } /* Notice: startbit should be bigger (or equal) than stopbit count like big E */ inline void btSetMaskBit16(unsigned short & a, int startbit, int stopbit, unsigned short newVal ) { btSetMaskBit(a,startbit,stopbit,newVal); } inline void btSetMaskBit8(uint8_t & a, int startbit, int stopbit, uint8_t newVal ) { btSetMaskBit(a,startbit,stopbit,newVal); } #endif