Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

145 lines
4.9 KiB

#ifndef _STRING_HPP_
#define _STRING_HPP_
// Ruler
// 1 2 3 4 5 6 7 8
//345678901234567890123456789012345678901234567890123456789012345678901234567890
/********************************************************************/
/* */
/* The standard layout. */
/* */
/* The standard layout for 'hpp' files for this code is as */
/* follows: */
/* */
/* 1. Include files. */
/* 2. Constants exported from the class. */
/* 3. Data structures exported from the class. */
/* 4. Forward references to other data structures. */
/* 5. Class specifications (including inline functions). */
/* 6. Additional large inline functions. */
/* */
/* Any portion that is not required is simply omitted. */
/* */
/********************************************************************/
#include "Global.hpp"
#include "Lock.hpp"
#include "Spinlock.hpp"
#include "Unique.hpp"
/********************************************************************/
/* */
/* A string class. */
/* */
/* A typical string class manages variable length text strings. */
/* Although we support the same in this class we ensure that */
/* there is only one copy of every unique string. There is a */
/* cost associated with this at string creation time but a big */
/* win when the strings are heavily compared, copied or */
/* replicated. */
/* */
/********************************************************************/
class STRING
{
//
// Private data.
//
DETAIL *Detail;
//
// Static private data.
//
#ifdef DISABLE_STRING_LOCKS
STATIC UNIQUE<NO_LOCK> *Unique;
#else
STATIC SPINLOCK Spinlock;
STATIC UNIQUE<FULL_LOCK> *Unique;
#endif
public:
//
// Public inline functions.
//
STRING( VOID )
{ DefaultString(); }
STRING( CHAR *String )
{ CreateString( String,strlen( String ) ); }
STRING( CHAR *String,SBIT32 Size )
{ CreateString( String,Size ); }
STRING( CONST STRING & Update )
{ Detail = Unique -> CopyString( DefaultString(),Update.Detail ); }
INLINE VOID operator=( CONST STRING & Update )
{ Detail = Unique -> CopyString( Detail,Update.Detail ); }
INLINE BOOLEAN operator==( CONST STRING & String )
{ return (Detail == String.Detail); }
INLINE BOOLEAN operator!=( CONST STRING & String )
{ return (Detail != String.Detail); }
INLINE BOOLEAN operator<( CONST STRING & String )
{ return (Unique -> CompareStrings( Detail,String.Detail ) < 0); }
INLINE BOOLEAN operator<=( CONST STRING & String )
{ return (Unique -> CompareStrings( Detail,String.Detail ) <= 0); }
INLINE BOOLEAN operator>( CONST STRING & String )
{ return (Unique -> CompareStrings( Detail,String.Detail ) > 0); }
INLINE BOOLEAN operator>=( CONST STRING & String )
{ return (Unique -> CompareStrings( Detail,String.Detail ) >= 0); }
INLINE SBIT32 Size( VOID )
{ return Unique -> Size( Detail ); }
INLINE CHAR *Value( VOID )
{ return Unique -> Value( Detail ); }
INLINE SBIT32 ValueID( VOID )
{ return ((SBIT32) Detail); }
~STRING( VOID )
{ DeleteString(); }
private:
//
// Private functions.
//
VOID CreateStringTable( VOID );
//
// Private inline functions.
//
DETAIL *CreateString( CHAR *String,SBIT32 Size )
{
VerifyStringTable();
return (Detail = Unique -> CreateString( String,Size ));
}
DETAIL *DefaultString( VOID )
{
VerifyStringTable();
return (Detail = Unique -> DefaultString());
}
VOID DeleteString( VOID )
{
if ( Unique != NULL )
{ Unique -> DeleteString( Detail ); }
}
VOID VerifyStringTable( VOID )
{
if ( Unique == NULL )
{ CreateStringTable(); }
}
};
#endif