Listing 1: Using the Trace class

#include <iostream.h>
#include <stdio.h>

const int MAX_PACKET_SIZE = 50;

class Packet{
    char m_Data[MAX_PACKET_SIZE];
public:
    Packet(int num) {sprintf(m_Data,"Packet No. %d",num);}
    // This function dumps class Packet
    void Dump() const
    { 
        cout <<m_Data<<endl;
    }
};

class Trace{
public:
    // For tracing an integer variable
    const Trace& operator()(const char *s,int iVal)const
    {cout << s << iVal<<endl;return *this;}
    // For tracing an object of class Packet
    const Trace& operator()(const char *s,const Packet &pkt)const
    { pkt.Dump();return *this;}
    // For tracing an array of strings
    const Trace& operator()(const char *s,char **p,int numStr)const
    { 
      cout << s << endl;
      for(int i=0;i<numStr;i++)
        cout << p[i] << endl;
      return *this;
    }
};

Trace gTrace;

void main(char argc,char **argv)
{
    gTrace("The commandLine args=",argv,argc);
    
    char *strArray[10];
    Packet sendPacket(1);
    Packet recvPacket(2);
    int numPkt = 2;
    for(int i=0;i<10;i++)
    {
        strArray[i] = new char[20];
        sprintf(strArray[i],"String No. %d ",i);
    }
    
    gTrace("The no. of Strings=", 10)("strArray=", strArray, 10)
          ("sendPacket=", sendPacket)("recvPacket=", recvPacket)
          ("numPackets=", numPkt);
    for(i=0;i<10;i++)
        delete[] strArray[i];
}
//End of File