mirror of
				https://github.com/RangeNetworks/openbts.git
				synced 2025-11-03 21:33:15 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			139 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
* Copyright 2011, 2014 Range Networks, Inc.
 | 
						|
*
 | 
						|
* This software is distributed under multiple licenses;
 | 
						|
* see the COPYING file in the main directory for licensing
 | 
						|
* information for this specific distribution.
 | 
						|
*
 | 
						|
* This use of this software may be subject to additional restrictions.
 | 
						|
* See the LEGAL file in the main directory for details.
 | 
						|
 | 
						|
    This program 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.
 | 
						|
*/
 | 
						|
 | 
						|
// (pat) This file defines initialized scalar types: Bool_z, Int_z, UInt_z, Size_t_z etc., which function like
 | 
						|
// their normal counterparts (with exceptions noted below) but are guaranteed initialized to 0.
 | 
						|
 | 
						|
#ifndef SCALARTYPES_H
 | 
						|
#define SCALARTYPES_H
 | 
						|
#include <iostream>	// For size_t
 | 
						|
#include <stdint.h>
 | 
						|
//#include "GSMCommon.h"	// Was included for Z100Timer
 | 
						|
 | 
						|
// We dont bother to define *= /= etc.; you'll have to convert: a*=b; to: a=a*b;
 | 
						|
#define _INITIALIZED_SCALAR_BASE_FUNCS(Classname,Basetype,Init) \
 | 
						|
	Classname() : value(Init) {} \
 | 
						|
	Classname(Basetype wvalue) { value = wvalue; } /* Can set from basetype. */ \
 | 
						|
	operator Basetype(void) const { return value; }		/* Converts from basetype. */ \
 | 
						|
	Basetype operator=(Basetype wvalue) { return value = wvalue; } \
 | 
						|
	Basetype* operator&() { return &value; }
 | 
						|
 | 
						|
#define _INITIALIZED_SCALAR_ARITH_FUNCS(Basetype) \
 | 
						|
	Basetype operator++() { return ++value; } \
 | 
						|
	Basetype operator++(int) { return value++; } \
 | 
						|
	Basetype operator--() { return --value; } \
 | 
						|
	Basetype operator--(int) { return value--; } \
 | 
						|
	Basetype operator+=(Basetype wvalue) { return value = value + wvalue; } \
 | 
						|
	Basetype operator-=(Basetype wvalue) { return value = value - wvalue; }
 | 
						|
 | 
						|
#define _INITIALIZED_SCALAR_FUNCS(Classname,Basetype,Init) \
 | 
						|
	_INITIALIZED_SCALAR_BASE_FUNCS(Classname,Basetype,Init) \
 | 
						|
	_INITIALIZED_SCALAR_ARITH_FUNCS(Basetype)
 | 
						|
 | 
						|
 | 
						|
#define _DECLARE_SCALAR_TYPE(Classname_i,Classname_z,Basetype) \
 | 
						|
	template <Basetype Init> \
 | 
						|
	struct Classname_i { \
 | 
						|
		Basetype value; \
 | 
						|
		_INITIALIZED_SCALAR_FUNCS(Classname_i,Basetype,Init) \
 | 
						|
	}; \
 | 
						|
	typedef Classname_i<0> Classname_z;
 | 
						|
 | 
						|
 | 
						|
// Usage:
 | 
						|
// Where 'classname' is one of the types listed below, then:
 | 
						|
// 		classname_z specifies a zero initialized type;
 | 
						|
// 		classname_i<value> initializes the type to the specified value.
 | 
						|
// We also define Float_z.
 | 
						|
_DECLARE_SCALAR_TYPE(Int_i, 	Int_z,  	int)
 | 
						|
_DECLARE_SCALAR_TYPE(Char_i,	Char_z, 	signed char)
 | 
						|
_DECLARE_SCALAR_TYPE(Int16_i,	Int16_z,	int16_t)
 | 
						|
_DECLARE_SCALAR_TYPE(Int32_i,	Int32_z,	int32_t)
 | 
						|
_DECLARE_SCALAR_TYPE(UInt_i,  	UInt_z,  	unsigned)
 | 
						|
_DECLARE_SCALAR_TYPE(UChar_i,  	UChar_z,  	unsigned char)
 | 
						|
_DECLARE_SCALAR_TYPE(UInt16_i,	UInt16_z,	uint16_t)
 | 
						|
_DECLARE_SCALAR_TYPE(UInt32_i,	UInt32_z,	uint32_t)
 | 
						|
_DECLARE_SCALAR_TYPE(Size_t_i,	Size_t_z,	size_t)
 | 
						|
 | 
						|
// Bool is special because it cannot accept some arithmetic funcs
 | 
						|
//_DECLARE_SCALAR_TYPE(Bool_i,  	Bool_z, 	bool)
 | 
						|
template <bool Init>
 | 
						|
struct Bool_i {
 | 
						|
	bool value;
 | 
						|
	_INITIALIZED_SCALAR_BASE_FUNCS(Bool_i,bool,Init)
 | 
						|
};
 | 
						|
typedef Bool_i<0> Bool_z;
 | 
						|
 | 
						|
// float is special, because C++ does not permit the template initalization:
 | 
						|
struct Float_z {
 | 
						|
	float value;
 | 
						|
	_INITIALIZED_SCALAR_FUNCS(Float_z,float,0)
 | 
						|
};
 | 
						|
struct Double_z {
 | 
						|
	double value;
 | 
						|
	_INITIALIZED_SCALAR_FUNCS(Double_z,double,0)
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
class ItemWithValueAndWidth {
 | 
						|
	public:
 | 
						|
	virtual unsigned getValue() const = 0;
 | 
						|
	virtual unsigned getWidth() const = 0;
 | 
						|
};
 | 
						|
 | 
						|
// A Range Networks Field with a specified width.
 | 
						|
// See RLCMessages.h for examples.
 | 
						|
template <int Width=32, unsigned Init=0>
 | 
						|
class Field_i : public ItemWithValueAndWidth
 | 
						|
{
 | 
						|
	public:
 | 
						|
	unsigned value;
 | 
						|
	_INITIALIZED_SCALAR_FUNCS(Field_i,unsigned,Init)
 | 
						|
	unsigned getWidth() const { return Width; }
 | 
						|
	unsigned getValue() const { return value; }
 | 
						|
};
 | 
						|
 | 
						|
// Synonym for Field_i, but no way to do it.
 | 
						|
template <int Width, unsigned Init=0>
 | 
						|
class Field_z : public ItemWithValueAndWidth
 | 
						|
{
 | 
						|
	public:
 | 
						|
	unsigned value;
 | 
						|
	_INITIALIZED_SCALAR_FUNCS(Field_z,unsigned,Init)
 | 
						|
	unsigned getWidth() const { return Width; }
 | 
						|
	unsigned getValue() const { return value; }
 | 
						|
};
 | 
						|
 | 
						|
// This is an uninitialized field.
 | 
						|
template <int Width=32, unsigned Init=0>
 | 
						|
class Field : public ItemWithValueAndWidth
 | 
						|
{
 | 
						|
	public:
 | 
						|
	unsigned value;
 | 
						|
	_INITIALIZED_SCALAR_FUNCS(Field,unsigned,Init)
 | 
						|
	unsigned getWidth() const { return Width; }
 | 
						|
	unsigned getValue() const { return value; }
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
// A Z100Timer with an initial value specified.
 | 
						|
//template <int Init>
 | 
						|
//class Z100Timer_i : public GSM::Z100Timer {
 | 
						|
//	public:
 | 
						|
//	Z100Timer_i() : GSM::Z100Timer(Init) {}
 | 
						|
//};
 | 
						|
 | 
						|
#endif
 |