Listing 2: UtilityMacros.cpp — Tests utility macros

/////////////////// UtilityMacros.cpp ///////////////// rado ///
//                                                            //
//  Copyright (c) 1999 Radoslav Getov                         //
//                                                            //
//  Permission to use, copy, modify and distribute this       //
//  software is granted without fee, provided that the above  //
//  copyright notice and this permission notice appear in the //
//  modified source and the source files that #include it.    //
//                                                            //
////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////
//                                                            //
//  Test for the macros defined in the header file.           //
//                                                            //
////////////////////////////////////////////////////////////////


#include "UtilityMacros.h"    

#include <assert.h>   // for assert()
#include <string.h>   // for strlen()
#include <iostream>   // for std::cout


//=======================| testREPEAT |=========================
// Test '#REPEAT_XXXX'
//________________________________________________________rado__
static void testREPEAT()
{
#define SIZEOF(array) (sizeof(array)/sizeof(*array))

std::cout << "testREPEAT()\n";

// Test REPEAT_xxx
char str[] = REPEAT (1024, " ");
assert (strlen (str) == 1024);
assert (SIZEOF (str) == 1025);   // including trailing 0

int ones[] = { REPEAT_WC (1024, 1) };
assert (SIZEOF (ones) == 1024);
}

AT_START (
         testREPEAT();
         )



//=======================| test__LINE__ |=======================
// Test UNIQUE_NAME, LINE_STRING, HERE
//________________________________________________________rado__
static void test__LINE__()
{
std::cout << "test__LINE__()\n";

// Test UNIQUE_NAME
int UNIQUE_NAME = 1,
    UNIQUE_NAME = 2;

// Test LINE_STRING & HERE  
#pragma message (HERE " Click on me!")  // MSVC++ 5.0+ only?   
}

AT_START (
         test__LINE__(); 
         )


void x(int,int);
//======================| testControl |=========================
// Test for #LOOP, #ONCE, #SKIP, and #REV_SKIP
//________________________________________________________rado__
static void testControl()
{
std::cout << "testControl()\n";

int any      = 0,
    once     = 0,
    skip     = 0,
    rev_skip = 0;
    
LOOP (50)
   {
   any++;                     // 50*1  == 50
   ONCE (once++;)             // 0+1   == 1
   SKIP (10, skip++; )        // 50/10 == 5
   REV_SKIP (10, rev_skip++;) // 50 - 50/10 = 45
   }

assert (any      == 50 && 
        once     == 1  && 
        skip     == 5  && 
        rev_skip == 45 );

LOOP_C (50, any++;)           // 50 + 50 == 100
assert (any  == 100);
}

AT_START (
         testControl();
         )



//======================| testSAVE |============================
// Test for SAVE, SAVE_T, DELAYED_ASSIGN and DELAYED_ASSIGN_T
//________________________________________________________rado__
static int iSAVE   = 1, 
           iSAVE_T = 2,
           iASS    = 3,
           iASS_T  = 4;  

static void testSAVE()
{
SAVE   (iSAVE)
SAVE_T (int, iSAVE_T)

DELAYED_ASSIGN (iASS, 10);
DELAYED_ASSIGN_T (int, iASS_T, 20);

iSAVE = iSAVE_T = iASS = iASS_T = 0;  
}

AT_START (
         std::cout << "test SAVE\n";
         testSAVE();
         assert (iSAVE   == 1  && 
                 iSAVE_T == 2  && 
                 iASS    == 10 &&
                 iASS_T  == 20 );
         )



//====================| AT_START & AT_END |=====================
// Pay attention to the execution order.
//________________________________________________________rado__
AT_START ( printf ("Before main()\n"     ); )
AT_START ( printf ("More before main()\n"); )

AT_END   ( printf ("More after main()\n" ); )
AT_END   ( printf ("After main()\n"      ); )



//========================| main |==============================
// main() just for building
//________________________________________________________rado__
void main()
{
std::cout << "main()\n";
}