REFTIME.H

//==========================================================================; 
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
// PURPOSE.
//
// Copyright (c) 1992 - 1997 Microsoft Corporation. All Rights Reserved.
//
//--------------------------------------------------------------------------;

//
// CRefTime
//
// Manage reference times.
// Shares same data layout as REFERENCE_TIME, but adds some (nonvirtual)
// functions providing simple comparison, conversion and arithmetic.
//
// A reference time (at the moment) is a unit of seconds represented in
// 100ns units as is used in the Win32 FILETIME structure. BUT the time
// a REFERENCE_TIME represents is NOT the time elapsed since 1/1/1601 it
// will either be stream time or reference time depending upon context
//
// This class provides simple arithmetic operations on reference times
//
// keep non-virtual otherwise the data layout will not be the same as
// REFERENCE_TIME


// -----
// note that you are safe to cast a CRefTime* to a REFERENCE_TIME*, but
// you will need to do so explicitly
// -----


#ifndef __REFTIME__
#define __REFTIME__


const LONGLONG MILLISECONDS = (1000); // 10 ^ 3
const LONGLONG NANOSECONDS = (1000000000); // 10 ^ 9
const LONGLONG UNITS = (NANOSECONDS / 100); // 10 ^ 7

/* Unfortunately an inline function here generates a call to __allmul
- even for constants!
*/
#define MILLISECONDS_TO_100NS_UNITS(lMs) \
Int32x32To64((lMs), (UNITS / MILLISECONDS))

class CRefTime
{
public:

// *MUST* be the only data member so that this class is exactly
// equivalent to a REFERENCE_TIME.
// Also, must be *no virtual functions*

REFERENCE_TIME m_time;

inline CRefTime()
{
// default to 0 time
m_time = 0;
};

inline CRefTime(LONG msecs)
{
m_time = MILLISECONDS_TO_100NS_UNITS(msecs);
};

inline CRefTime(REFERENCE_TIME rt)
{
m_time = rt;
};

inline operator REFERENCE_TIME() const
{
return m_time;
};

inline CRefTime& operator=(const CRefTime& rt)
{
m_time = rt.m_time;
return *this;
};

inline CRefTime& operator=(const LONGLONG ll)
{
m_time = ll;
return *this;
};

inline CRefTime& operator+=(const CRefTime& rt)
{
return (*this = *this + rt);
};

inline CRefTime& operator-=(const CRefTime& rt)
{
return (*this = *this - rt);
};

inline LONG Millisecs(void)
{
return (LONG)(m_time / (UNITS / MILLISECONDS));
};

inline LONGLONG GetUnits(void)
{
return m_time;
};
};

const LONGLONG TimeZero = 0;

#endif /* __REFTIME__ */