Common
[Implementation]


Detailed Description

Common.h provides macro's and classes that must be available to the other files that make up the Rulbus Device Class Library.

It defines the following:

Common.h must be included by all source files either directly, or indirectly.

Common.h and Assertion draw on the work provided by the CoreLinux++ consortium [CORELINUX++].


Classes

struct  isEqual
 predicate for apgorithms to compare floating types like Volt, Time and Freq.


Defines

#define DEBUG   DFLAG_NONE
 define the subjects to include in debugging.

#define DFLAG_NONE   0x0000
 include no debug subjects.

#define DFLAG_ALL   0xFFFF
 include all debug subjects.

#define DFLAG_PRODUCTION   (DFLAG_ALL & ~DFLAG_ENSURE)
 include all but ensure debug subjects.

#define DFLAG_GENERAL   0x0001
 debug subjects combined in one group.

#define DFLAG_INTERFACE   0x0002
 report more details on Rulbus Interface errors.

#define DFLAG_BUSVIOLATION   0x0004
 check for Rulbus address/data violations.

#define DFLAG_REQUIRE   0x0010
 design-by-contract: require pre-condition.

#define DFLAG_ENSURE   0x0020
 design-by-contract: ensure post-condition.

#define DFLAG_NEVER_GET_HERE   0x0040
 design-by-contract: ensure never reached.

#define dim(a)   (sizeof(a)/sizeof((a)[0]))
 array dimension.

#define DECLARE_TYPE(mydecl, mytype)
 declare a new type and its pointer, const pointer, reference, and const reference types.

#define DECLARE_CLASS(tag)
 declare class, class pointer, const pointer, class reference and const class reference types for classes.

#define PROXY_CAST   dynamic_cast
 use dynamic_cast to cast RulbusDevice to actual class type.


Typedefs

typedef isEqual< VoltRulbus::isEqualVolt
 predicate to compare Volt

typedef isEqual< TimeRulbus::isEqualTime
 predicate to compare Time

typedef isEqual< FreqRulbus::isEqualFreq
 predicate to compare Freq

typedef signed char Rulbus::int8
 the compiler's signed 8-bit integral type.

typedef unsigned char Rulbus::uInt8
 the compiler's unsigned 8-bit integral type.

typedef signed short int Rulbus::int16
 the compiler's signed 16-bit integral type.

typedef unsigned short int Rulbus::uInt16
 the compiler's unsigned 16-bit integral type.

typedef signed int Rulbus::int32
 the compiler's signed 32-bit integral type.

typedef unsigned int Rulbus::uInt32
 the compiler's unsigned 32-bit integral type.

typedef float Rulbus::float32
 the compiler's 32-bit real type.

typedef double Rulbus::float64
 the compiler's 64-bit real type.

typedef uInt8 Rulbus::Byte
 the libraries' byte type.

typedef uInt16 Rulbus::Word
 the libraries' word (2-Byte) type.

typedef uInt32 Rulbus::Quad
 the libraries' double word (4-Byte) type.

typedef char Rulbus::Char
 the libraries' character type.

typedef int Rulbus::Int
 the libraries' signed integral type.

typedef int16 Rulbus::Int16
 the libraries' 16-bit signed integral type.

typedef int32 Rulbus::Int32
 the libraries' 32-bit signed integral type.

typedef double Rulbus::Real
 the libraries' real type.

typedef float32 Rulbus::Real32
 the libraries' 32-bit real type.

typedef float64 Rulbus::Real64
 the libraries' 64-bit real type.

typedef std::string Rulbus::String
 the libraries' string type.

typedef std::exception Rulbus::StdException
 the std::exception type.

typedef String Rulbus::Name
 the Rulbus device name type.

typedef Int Rulbus::Addr
 the Rulbus address type.

typedef Int Rulbus::Rack
 the Rulbus rack number type.

typedef Real Rulbus::Volt
 the voltage type.

typedef Real32 Rulbus::Volt32
 the 32-bit voltage type.

typedef Real Rulbus::Time
 the time type.

typedef Real Rulbus::Freq
 the frequency type.


Define Documentation

#define DEBUG   DFLAG_NONE
 

DEBUG contains a bit-pattern that specifies which subjects must be included in the debugging:

  • DFLAG_NONE include no debug subjects
  • DFLAG_ALL include all debug subjects
  • DFLAG_PRODUCTION include all but ensure debug subjects
  • DFLAG_GENERAL debug subjects combined in one group
  • DFLAG_INTERFACE report more details on Rulbus Interface errors
  • DFLAG_BUSVIOLATION check for Rulbus address/data violations
  • DFLAG_REQUIRE design-by-contract: require pre-condition.
  • DFLAG_ENSURE design-by-contract: ensure post-condition.
  • DFLAG_NEVER_GET_HERE design-by-contract: ensure never reached.

Following Kernighan & Pike [1999], page 200, we use DEBUG in an if statement:

 if ( DEBUG & DFLAG_BUSVIOLATION )
    // action...

By using an if statement as opposed to a preprocessor #if line, the syntax of the debug code is also checked when the debug code is inactivated.

If the (constant) condition evaluates to zero, the Borland C++ 5.6 compiler optimization process will change the test into an unconditional jump, so the debugging code incurs little execution overhead if not used. However the (unreachable) code for the if-statement is retained in the generated code. (Other compilers may remove the if-statement completely.)

/*
 * debug.cpp - determine presence of debugging code.
 */

#define DFLAG_NONE    0x0000
#define DFLAG_GENERAL 0x0001

#define DEBUG DFLAG_NONE

void debug( const char *msg );

int main()
{
   if ( DEBUG & DFLAG_GENERAL )
   {
      debug( "general debugging" );
   }

   return 0;
}

Generates the following assembly code:

        .386p
        ifdef ??version
        if ??version GT 500H
        .mmx
        endif
        endif
        model flat
        ifndef  ??version
        ?debug  macro
        endm
        endif
        ?debug  S "debug.cpp"
        ?debug  T "debug.cpp"
_TEXT   segment dword public use32 'CODE'
_TEXT   ends
_DATA   segment dword public use32 'DATA'
_DATA   ends
_BSS    segment dword public use32 'BSS'
_BSS    ends
DGROUP  group   _BSS,_DATA
_TEXT   segment dword public use32 'CODE'
_main   segment virtual
@_main  proc    near
?live16385@0:
 ;      
 ;      int main()
 ;      
        push ebp
        mov ebp,esp
 ;      
 ;      {
 ;         if ( DEBUG & DFLAG_GENERAL )
 ;      
@1:
        jmp short @2
 ;      
 ;         {
 ;            debug( "general debugging" );
 ;      
        push offset s@
        call @@debug$qpxc
        pop ecx
 ;      
 ;         }
 ;      
 ;         return 0;
 ;      
@2:
        xor eax,eax
 ;      
 ;      }
 ;      
@4:
@3:
        pop ebp
        ret 
@_main  endp
_main   ends
_TEXT   ends
_DATA   segment dword public use32 'DATA'
s@      label   byte
        ;       s@+0:
        db      "general debugging",0
        align   4
_DATA   ends
_TEXT   segment dword public use32 'CODE'
_TEXT   ends
@@debug$qpxc equ @debug$qpxc
 extrn @debug$qpxc:near
        ?debug  D "debug.cpp" 12620 28747
        end

#define DECLARE_CLASS tag   ) 
 

Value:

class   tag;                         \
   typedef tag *       tag ## Ptr;      \
   typedef const tag * tag ## Cptr;     \
   typedef tag &       tag ## Ref;      \
   typedef const tag & tag ## Cref;

#define DECLARE_TYPE mydecl,
mytype   ) 
 

Value:

typedef mydecl         mytype;          \
typedef mytype *       mytype ## Ptr;   \
typedef const mytype * mytype ## Cptr;  \
typedef mytype &       mytype ## Ref;   \
typedef const mytype & mytype ## Cref;


Generated on Tue Oct 12 14:12:03 2004 for Rulbus Device Class Library for Microsoft Windows by doxygen 1.3.4