home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powergui.iso / trialva / ibmcppw / include / ibitflag.hpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-22  |  10.9 KB  |  285 lines

  1. #ifndef _IBITFLAG_
  2.   #define _IBITFLAG_
  3. /*******************************************************************************
  4. * FILE NAME: ibitflag.hpp                                                      *
  5. *                                                                              *
  6. * DESCRIPTION:                                                                 *
  7. *   Declaration of the classes:                                                *
  8. *     IBitFlag                                                                 *
  9. *                                                                              *
  10. *   Definition of the macros:                                                  *
  11. *     INESTEDBITFLAGCLASSDEF0                                                  *
  12. *     INESTEDBITFLAGCLASSDEF1                                                  *
  13. *     INESTEDBITFLAGCLASSDEF2                                                  *
  14. *     INESTEDBITFLAGCLASSDEF3                                                  *
  15. *     INESTEDBITFLAGCLASSDEF4                                                  *
  16. *     INESTEDBITFLAGCLASSFUNCS                                                 *
  17. *                                                                              *
  18. * COPYRIGHT:                                                                   *
  19. *   IBM Open Class Library                                                     *
  20. *   (C) Copyright International Business Machines Corporation 1992, 1996       *
  21. *   Licensed Material - Program-Property of IBM - All Rights Reserved.         *
  22. *   US Government Users Restricted Rights - Use, duplication, or disclosure    *
  23. *   restricted by GSA ADP Schedule Contract with IBM Corp.                     *
  24. *                                                                              *
  25. *******************************************************************************/
  26. #include <ibase.hpp>
  27.  
  28. #pragma pack(4)
  29.  
  30.  
  31. class IBitFlag : public IBase {
  32. typedef IBase
  33.   Inherited;
  34. public:
  35. /*--------------------------------- Queries ----------------------------------*/
  36. unsigned long
  37.   asUnsignedLong         ( ) const,
  38.   asExtendedUnsignedLong ( ) const;
  39.  
  40. /*-------------------------------- Comparisons -------------------------------*/
  41. Boolean
  42.   operator ==    ( const IBitFlag &rhs ) const,
  43.   operator !=    ( const IBitFlag &rhs ) const;
  44.  
  45. protected:
  46. /*------------------------- Constructors -------------------------------------*/
  47.   IBitFlag       ( unsigned long value,
  48.                    unsigned long extendedValue = 0 );
  49.  
  50. /*-------------------------------- Assignment --------------------------------*/
  51. IBitFlag
  52.  &setValue       ( unsigned long value ,
  53.                    unsigned long extendedValue = 0 );
  54.  
  55. private:
  56. /*--------------------------------- Private ----------------------------------*/
  57. unsigned long
  58.   ulClValue,
  59.   ulClExtValue;
  60. }; /* IBitFlag */
  61.  
  62.  
  63. /*---------------------------- Macro Definitions -----------------------------*/
  64. #define INESTEDBITFLAGCLASSDEF0( className, assoc )\
  65. class className : public IBitFlag\
  66. {\
  67. friend class assoc;\
  68. public:\
  69.   class Negated##className : public IBitFlag\
  70.   {\
  71.   friend class className;\
  72.   public:\
  73.     COMMONNEGBITPUBLIC0( className )\
  74.   protected:\
  75.     COMMONNEGBITPROTECTED( className )\
  76.   };\
  77.   COMMONBITPUBLIC( className )\
  78.   COMMONBITPUBLIC0( className )\
  79. protected:\
  80.   COMMONBITPROTECTED( className )\
  81. }
  82.  
  83.  
  84. #define INESTEDBITFLAGCLASSDEF1( className, assoc, base1 )\
  85. class className : public IBitFlag\
  86. {\
  87. friend class assoc;\
  88. public:\
  89.   class Negated##className : public IBitFlag\
  90.   {\
  91.   friend class className;\
  92.   public:\
  93.     COMMONNEGBITPUBLIC1( className, base1 )\
  94.   protected:\
  95.     COMMONNEGBITPROTECTED( className )\
  96.   };\
  97.   COMMONBITPUBLIC( className )\
  98.   COMMONBITPUBLIC1( className, base1 )\
  99. protected:\
  100.   COMMONBITPROTECTED( className )\
  101. }
  102.  
  103. #define INESTEDBITFLAGCLASSDEF2( className, assoc, base1, base2 )\
  104. class className : public IBitFlag\
  105. {\
  106. friend class assoc;\
  107. public:\
  108.   class Negated##className : public IBitFlag\
  109.   {\
  110.   friend class className;\
  111.   public:\
  112.     COMMONNEGBITPUBLIC1( className, base1 )\
  113.     COMMONNEGBITPUBLICn( className, base2 )\
  114.   protected:\
  115.     COMMONNEGBITPROTECTED( className )\
  116.   };\
  117.   COMMONBITPUBLIC( className )\
  118.   COMMONBITPUBLIC1( className, base1 )\
  119.   COMMONBITPUBLICn( className, base2 )\
  120. protected:\
  121.   COMMONBITPROTECTED( className )\
  122. }
  123.  
  124. #define INESTEDBITFLAGCLASSDEF3( className, assoc, base1, base2, base3 )\
  125. class className : public IBitFlag\
  126. {\
  127. friend class assoc;\
  128. public:\
  129.   class Negated##className : public IBitFlag\
  130.   {\
  131.   friend class className;\
  132.   public:\
  133.     COMMONNEGBITPUBLIC1( className, base1 )\
  134.     COMMONNEGBITPUBLICn( className, base2 )\
  135.     COMMONNEGBITPUBLICn( className, base3 )\
  136.   protected:\
  137.     COMMONNEGBITPROTECTED( className )\
  138.   };\
  139.   COMMONBITPUBLIC( className )\
  140.   COMMONBITPUBLIC1( className, base1 )\
  141.   COMMONBITPUBLICn( className, base2 )\
  142.   COMMONBITPUBLICn( className, base3 )\
  143. protected:\
  144.   COMMONBITPROTECTED( className )\
  145. }
  146.  
  147. #define INESTEDBITFLAGCLASSDEF4( className, assoc, base1, base2, base3, base4 )\
  148. class className : public IBitFlag\
  149. {\
  150. friend class assoc;\
  151. public:\
  152.   class Negated##className : public IBitFlag\
  153.   {\
  154.   friend class className;\
  155.   public:\
  156.     COMMONNEGBITPUBLIC1( className, base1 )\
  157.     COMMONNEGBITPUBLICn( className, base2 )\
  158.     COMMONNEGBITPUBLICn( className, base3 )\
  159.     COMMONNEGBITPUBLICn( className, base4 )\
  160.   protected:\
  161.     COMMONNEGBITPROTECTED( className )\
  162.   };\
  163.   COMMONBITPUBLIC( className )\
  164.   COMMONBITPUBLIC1( className, base1 )\
  165.   COMMONBITPUBLICn( className, base2 )\
  166.   COMMONBITPUBLICn( className, base3 )\
  167.   COMMONBITPUBLICn( className, base4 )\
  168. protected:\
  169.   COMMONBITPROTECTED( className )\
  170. }
  171.  
  172. #define INESTEDBITFLAGCLASSFUNCS( className, assoc )\
  173. inline assoc##::##className  operator | ( const assoc##::##className &lhs,\
  174.                                           const assoc##::##className &rhs )\
  175. {\
  176.   assoc##::##className aResult ( lhs.asUnsignedLong() | rhs.asUnsignedLong(),\
  177.                                  lhs.asExtendedUnsignedLong() | rhs.asExtendedUnsignedLong() );\
  178.   return aResult;\
  179. }\
  180. inline assoc##::##className\
  181.   operator & ( const assoc##::##className &lhs,\
  182.                const assoc##::##className##::Negated##className &rhs )\
  183. {\
  184.   assoc##::##className aResult ( lhs.asUnsignedLong() & rhs.asUnsignedLong(),\
  185.                                  lhs.asExtendedUnsignedLong() & rhs.asExtendedUnsignedLong() );\
  186.   return aResult;\
  187. }\
  188. inline assoc##::##className##::Negated##className\
  189.   operator & ( const assoc##::##className##::Negated##className &lhs,\
  190.                const assoc##::##className##::Negated##className &rhs )\
  191. {\
  192.   assoc##::##className##::Negated##className aResult ( lhs.asUnsignedLong() & rhs.asUnsignedLong(),\
  193.                                                        lhs.asExtendedUnsignedLong() & rhs.asExtendedUnsignedLong() );\
  194.   return aResult;\
  195. }\
  196. inline assoc##::##className\
  197.   operator & ( const assoc##::##className##::Negated##className &lhs,\
  198.                const assoc##::##className &rhs )\
  199. {\
  200.   return rhs & lhs;\
  201. }\
  202. inline unsigned long  operator & ( const assoc##::##className &lhs,\
  203.                                    const assoc##::##className &rhs )\
  204. {\
  205.   unsigned long ulResult = lhs.asUnsignedLong() & rhs.asUnsignedLong();\
  206.   return ( ulResult | (lhs.asExtendedUnsignedLong() & rhs.asExtendedUnsignedLong()) );\
  207. } \
  208. inline unsigned long  operator & ( const assoc##::##className &lhs,\
  209.                                    const assoc##::##className &rhs )
  210.  
  211. #define COMMONBITPUBLIC( className )\
  212.   className##&  operator |= ( const className &aFlag )\
  213.   {\
  214.     className tmpFlag = *this | aFlag;\
  215.     this->setValue ( tmpFlag.asUnsignedLong(), tmpFlag.asExtendedUnsignedLong() );\
  216.     return *this;\
  217.   }\
  218.   Negated##className  operator ~ ( ) const\
  219.   {\
  220.     Negated##className aResult ( ~asUnsignedLong(), ~asExtendedUnsignedLong() );\
  221.     return aResult;\
  222.   }\
  223.   className##&  operator &= ( const Negated##className &aFlag )\
  224.   {\
  225.     className tmpFlag = *this & aFlag;\
  226.     this->setValue ( tmpFlag.asUnsignedLong(), tmpFlag.asExtendedUnsignedLong() );\
  227.     return *this;\
  228.   }
  229. #define COMMONBITPUBLIC0( className )\
  230.   className  operator | ( const className &aFlag ) const\
  231.   {\
  232.     className aResult ( asUnsignedLong() | aFlag.asUnsignedLong(),\
  233.                         asExtendedUnsignedLong() | aFlag.asExtendedUnsignedLong() );\
  234.     return aResult;\
  235.   }\
  236.   className  operator & ( const Negated##className &aFlag ) const\
  237.   {\
  238.     className aResult ( asUnsignedLong() & aFlag.asUnsignedLong(),\
  239.                         asExtendedUnsignedLong() & aFlag.asExtendedUnsignedLong() );\
  240.     return aResult;\
  241.   }\
  242.   unsigned long  operator & ( const className &aFlag ) const\
  243.   {\
  244.     unsigned long ulResult = asUnsignedLong() & aFlag.asUnsignedLong();\
  245.     return ( ulResult | (asExtendedUnsignedLong() & aFlag.asExtendedUnsignedLong()) );\
  246.   }
  247. #define COMMONBITPUBLIC1( className, baseName )\
  248.   COMMONBITPUBLICn ( className, baseName )\
  249.   friend inline className  operator | ( const className &lhs,\
  250.                                         const className &rhs );\
  251.   friend inline className  operator & ( const className &lhs,\
  252.                                         const Negated##className &rhs );
  253. #define COMMONBITPUBLICn( className, baseName )\
  254.   className ( const baseName##::##className &aFlag )\
  255.     : IBitFlag ( aFlag.asUnsignedLong(), aFlag.asExtendedUnsignedLong() ) {}
  256. #define COMMONNEGBITPUBLIC0( className )\
  257.     Negated##className  operator & ( const Negated##className &aFlag ) const\
  258.     {\
  259.       Negated##className aResult ( asUnsignedLong() & aFlag.asUnsignedLong(),\
  260.                                    asExtendedUnsignedLong() & aFlag.asExtendedUnsignedLong() );\
  261.       return aResult;\
  262.     }
  263. #define COMMONNEGBITPUBLIC1( className, baseName )\
  264.     COMMONNEGBITPUBLICn( className, baseName )\
  265.     friend inline Negated##className  operator & ( const Negated##className &lhs,\
  266.                                                    const Negated##className &rhs );\
  267.     friend inline className  operator & ( const Negated##className &lhs,\
  268.                                           const className &rhs );
  269. #define COMMONNEGBITPUBLICn( className, baseName )\
  270.     Negated##className ( const baseName##::##className##::Negated##className &aFlag )\
  271.       : IBitFlag ( aFlag.asUnsignedLong(), aFlag.asExtendedUnsignedLong() ) {}
  272. #define COMMONBITPROTECTED( className )\
  273.     className ( unsigned long val, unsigned long extVal=0 )\
  274.       : IBitFlag ( val, extVal ) {}
  275. #define COMMONNEGBITPROTECTED( className )\
  276.     Negated##className ( unsigned long val, unsigned long extVal=0 )\
  277.       : IBitFlag ( val, extVal ) {}
  278.  
  279. #pragma pack()
  280.  
  281. /*----------------------------- Inline Functions -----------------------------*/
  282.   #include <ibitflag.inl>
  283.  
  284. #endif /* _IBITFLAG_ */
  285.