/* -------------------------------------------------------------------- */
/* */
/* FILE : sdata.h */
/* */
/* DESC : Sampler data definition. */
/* */
/* PROJ : CSA\sampler */
/* */
/* CREATED 16.02.98 19:28 by L&M. */
/* MODIFIED 03.02.99 13:27 by A.V. */
/* */
/* */
/* 1995-98 (c) by Leonid Moiseichuk */
/* -------------------------------------------------------------------- */

#ifndef __sdata_h
#define __sdata_h

/* ==========================[ includes ]============================== */

#ifndef __MEM_H
#include <Mem.h>
#endif

#ifndef __STRING_H
#include <String.h>
#endif

#ifndef __DIR_H
#include <Dir.h>
#endif

#ifndef __STDIO_H
#include <StdIO.h>
#endif

#ifndef __timer_h
#include "Timer.h"
#endif

/* ===========================[ defines ]============================== */

typedef const char far* PChar;
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;

typedef char FileName[ MAXPATH ];
typedef uchar FileHandle;

#define MAX_FILES 8u
// Maximum 8 files
#define MAX_LINES 52u
// Maximum of sampling lines in a file
#define MAX_CONDS 8u
// Maximum of conditions for each line
#define MAX_ENTRIES (MAX_FILES * MAX_LINES)

/*
-----------------------------------------------------------------------
Size of SamplerList is MAX_CONDS * 9 + 4 ( current 76 bytes ).
We create MAX_ENTRIES SamplerLists :
== > this array will be little 64K
==> Sizeof(SamplerList) * MAX_ENTRIES < 64K
==> MAX_ENTRIES < 862.
Thus, if have 10 sampling files, we can have 86 lines at a each file.
-----------------------------------------------------------------------
*/

/* ===========================[ classes ]============================== */

class FileMgr
{
public :

FileMgr() : Counter(0)
{ memset( Files,0,sizeof(Files) ); }

~FileMgr() {}

FileHandle HandleOf( PChar );


void Print( FILE* Stream ) const;
void Put( FILE* Stream ) const ;
void Get( FILE* Stream ) ;

PChar NameOf( FileHandle index ) const;
uint Count () { return Counter; }

private :

FileName Files[ MAX_FILES ];
FileHandle Counter ;

}; // Class FileMgr

inline PChar FileMgr :: NameOf( FileHandle index ) const
{
return (index && index<=Counter ? PChar(Files[index-1]) : NULL);
}



class Locate
{
public :

Locate() : File(0), Line(0)
{}

Locate( FileHandle file, uint line ) : File(file), Line(line)
{}

int operator==( const Locate& aTest ) const
{ return (File==aTest.File && Line==aTest.Line); }

int operator <( const Locate& aTest ) const
{ return ( File<aTest.File ? 1 : (File==aTest.File && Line<aTest.Line) ); }

void operator =( const Locate& aSet )
{
File = aSet.File ;
Line = aSet.Line ;
}

void Print( FILE* Stream ) const
{ fprintf( Stream, "%2u :%4u",uint(File),Line ); }

void Put( FILE* Stream ) const ;
void Get( FILE* Stream ) ;

operator int() const
{ return File && Line; }

FileHandle FileID () { return File; }
uint LineNo () { return Line; }
protected :

FileHandle File;
uint Line;
}; // Class Locate

/* Inlines */

inline void Locate :: Put( FILE* Stream ) const
{
fwrite (&File,sizeof(File),1,Stream);
fwrite (&Line,sizeof(Line),1,Stream);
}

inline void Locate :: Get( FILE* Stream )
{
fread (&File,sizeof(File),1,Stream);
fread (&Line,sizeof(Line),1,Stream);
}



class SamplerRecord : public Locate
{
public :

SamplerRecord() { Prob = 0; }

void operator += ( const SamplerRecord& forAdd );
void Print( FILE* Stream, TIME ttime, Tscl Scale) const ;
void Put( FILE* Stream ) const ;
void Get( FILE* Stream ) ;

public :

TIME TotalTime ; /* Totals timing */
uint CrossTimes; /* How march times call */
float Prob;
}; // Class SamplerRecord

/* Inlines */

inline void SamplerRecord :: operator += ( const SamplerRecord& forAdd )
{
if ( Line>0 )
{
CrossTimes ++ ;
TotalTime += forAdd.TotalTime ;
}
else
memcpy(this,&forAdd,sizeof(SamplerRecord) );
} // operator +=

inline void SamplerRecord :: Print(FILE* Stream, TIME _ctime, Tscl Scale) const
{
double precTime = 0.0;
TIME corrTime(UINT32(_ctime)*CrossTimes);
if (TotalTime > corrTime)
precTime = TimeAsMicroSeconds(TotalTime - corrTime, Scale);
Locate::Print(Stream);
fprintf( Stream," %19.2lf %12u %6.2lf %17.2lf", precTime, CrossTimes, Prob, precTime/CrossTimes);

} // Print

inline void SamplerRecord :: Put( FILE* Stream ) const
{
Locate :: Put (Stream);
fwrite (&TotalTime,sizeof(TotalTime),1,Stream);
fwrite (&CrossTimes,sizeof(CrossTimes),1,Stream);
}

inline void SamplerRecord :: Get( FILE* Stream )
{
Locate :: Get (Stream);
fread (&TotalTime,sizeof(TotalTime),1,Stream);
fread (&CrossTimes,sizeof(CrossTimes),1,Stream);
}

struct SumOfInProbsInfo{
float Prob;
long CrossTimes;
};
/* --- Class SamplerList --- */
class SamplerList : public Locate
{
public :

SamplerList() : Counter(0), Prob(0), InArcs(0), SubCounter(0), SubEntriesPtr(0)
{ memset( Conditions,0,sizeof(Conditions) ); }

~SamplerList() {}

void Append( const SamplerRecord& rec );
void Print( FILE* Stream, TIME ttime, Tscl Scale) const ;
void Put( FILE* Stream ) const ;
void Get( FILE* Stream ) ;

SamplerRecord* CondOf( uchar idx )
{ return ( idx < Counter ? &(Conditions[idx]) : 0 ); }
uchar Count () { return Counter; }

typedef SamplerList* SmpLstArr[ MAX_ENTRIES]; //IV
SmpLstArr* SubEntriesPtr; //Pointer at Entries member of Access class
uint SubCounter ; //The number of elements in Entries
float Prob;
uint InArcs;
//both are to be initialized in run-time

// void LoadArc(uchar idx, float ProbVal); //IV
SumOfInProbsInfo SumOfInProbs();
private :
SamplerRecord Conditions[ MAX_CONDS ]; /* Refs for some conds to this line */
uchar Counter ; /* Counter for using records */
}; // Class SamplerList

class Storage
{
public :

Storage() : Counter(0)
{}

~Storage() {}

SamplerList* Allocate()
{ return ( Counter<MAX_ENTRIES ? &Space[Counter++] : NULL ); }

private :

SamplerList Space[ MAX_ENTRIES ]; /* The space for allocation */
uint Counter ;
}; // Class Storage


class Access
{
public :

Access() : Counter(0), timeTrue(0), corrNum(0)
{ memset( Entries,0,sizeof(Entries) );}

~Access() {}

SamplerList* Search( const Locate& ) const;
SamplerList* Search( const FileHandle, const uint, uint& ) const;
void Append( SamplerList* );
void Print( FILE* Stream ) const ;

void TrueTime (TIME ttrue);
TIME TrueTime ();
void CorrScale (Tscl Scale);
Tscl CorrScale ();
SamplerList* At (uint idx);
uint Count () { return Counter; }
void MapProbs();

private :

TIME timeTrue; /* Є®а४жЁп ­  Ё§¬ҐаҐ­Ёп ў вЁЄ е */
Tscl corrNum; /* Є®а४жЁп ¬ бив ЎЁа®ў ­Ёп */
SamplerList* Entries[ MAX_ENTRIES ];
uint Counter ;
friend class CallsHandler;
}; // Class Access

inline void Access :: TrueTime (TIME ttrue)
{
timeTrue = ttrue;
}

inline TIME Access :: TrueTime ()
{
return timeTrue ;
}

inline void Access :: CorrScale (Tscl Scale)
{
corrNum = Scale;
}

inline Tscl Access :: CorrScale ()
{
return corrNum ;
}

inline SamplerList* Access :: At (uint idx)
{
return ( idx < Counter ? Entries[idx] : NULL );
}

class CallsHandler
{
public :

CallsHandler();
~CallsHandler();

TIME TrueTime();
void TrueTime (TIME ttrue);
void CorrScale (Tscl Scale);
Tscl CorrScale ();
void Handle( TIME time, PChar File, uint Line );
void Print( FILE* , PChar Prog ) const ;
void Put( FILE* Stream ) const ;
int Get( FILE* Stream ) ;
void PrintCSA( FILE*, PChar Prog ) const ; //IV

operator int() const
{ return (SamplerAccess && SamplerStorage && SamplerFiles); }

public :

Access* SamplerAccess ;
Storage* SamplerStorage;
FileMgr* SamplerFiles ;
SamplerList* LastUsedRec;
}; // Class CallsHandler

inline void CallsHandler :: TrueTime (TIME ttrue)
{
if (SamplerAccess) SamplerAccess->TrueTime(ttrue);
}

inline TIME CallsHandler :: TrueTime ()
{
return ( (SamplerAccess)? SamplerAccess->TrueTime() : 0ul) ;
}

inline void CallsHandler :: CorrScale (Tscl Scale)
{
if (SamplerAccess) SamplerAccess->CorrScale (Scale);
}

inline Tscl CallsHandler :: CorrScale ()
{
return ( (SamplerAccess)? SamplerAccess->CorrScale() : 0) ;
}

#endif // Sentry of __sdata_h
Соседние файлы в папке Samp16