Files
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

977 lines
19 KiB
C++

//===========================================================================//
// File: notation.cpp //
// Title: Definition of NotationFile classes. //
// Project: Munga //
// Author: Ken Olsen //
// Purpose: Provide general purpose access to data stored in a formatted //
// text file. //
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 01/07/95 KEO Converted from Tool Architecture I. //
// 02/07/95 KEO Add AppendEntry methods. //
// 02/17/95 KEO Change page and entry lists to make nomenclature. //
// 03/11/95 KEO Remove all instances of strtok from class. //
// 03/24/95 KEO Add methods to read and write text in memory. //
// 03/31/95 KEO Add methods for lab only mark. //
// 05/23/95 KEO Add setpage and appendpage and allow setentry(,,null). //
// 11/11/95 KEO Add operation modes and correct small bugs. //
// 04/02/97 GAH Added "DeleteAllPages" method. //
//---------------------------------------------------------------------------//
// Copyright (c) 1994-1995 Virtual World Entertainment, Inc. //
// Copyright (c) 1996-1997 Fasa Interactive Technologies, Inc. //
// All rights reserved worldwide. //
// This unpublished source code is PROPRIETARY and CONFIDENTIAL. //
//===========================================================================//
#include "StuffHeaders.hpp"
#define MAX_LINE_SIZE 512
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Page::Page(NotationFile *notation_file):
Plug(DefaultData),
m_notes(NULL)
{
Check_Pointer(this);
Check_Object(notation_file);
m_notationFile = notation_file;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Page::~Page()
{
Check_Object(this);
m_notes.DeletePlugs();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::WriteNotes(MemoryStream *stream)
{
Check_Object(this);
const char* name = m_name;
if (name && *name)
*stream << '[' << name << "]\r\n";
NoteIterator notes(&m_notes);
Note *note;
while ((note = notes.ReadAndNext()) != NULL)
{
Check_Object(note);
note->WriteNotation(stream);
}
*stream << "\r\n";
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Note*
Page::FindNote(const char *entryname)
{
Check_Object(this);
Check_Pointer(entryname);
NoteIterator notes(&m_notes);
Note *note;
while ((note = notes.ReadAndNext()) != NULL)
{
Check_Object(note);
if (!_stricmp(note->m_name, entryname))
return note;
}
return NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Note*
Page::GetNote(unsigned i)
{
Check_Object(this);
NoteIterator notes(&m_notes);
return notes.GetNth(i);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
ChainOf<Note*>*
Page::MakeNoteChain(const char *entryname)
{
Check_Object(this);
Check_Pointer(entryname);
NoteIterator notes(&m_notes);
Note *note;
ChainOf<Note*>* chain = new(g_Heap) ChainOf<Note*>(NULL);
Check_Object(chain);
int len = strlen(entryname);
while ((note = notes.ReadAndNext()) != NULL)
{
Check_Object(note);
if (!_strnicmp(note->GetName(), entryname, len))
chain->Add(note);
}
return chain;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Note*
Page::AddNote(const char *entryname)
{
Check_Object(this);
Check_Pointer(entryname);
SetDirty();
Note *note = new(g_Heap) Note(this);
Check_Object(note);
note->SetName(entryname);
m_notes.Add(note);
return note;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Note*
Page::SetNote(const char *entryname)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = FindNote(entryname);
if (!note)
note = AddNote(entryname);
return note;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::DeleteNote(const char *entryname)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = FindNote(entryname);
if (note)
{
Check_Object(note);
delete note;
SetDirty();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::DeleteAllNotes()
{
Check_Object(this);
NoteIterator notes(&m_notes);
Note *note;
while ((note = notes.ReadAndNext()) != NULL)
{
Check_Object(note);
delete note;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
Page::GetEntry(
const char *entryname,
const char **contents,
bool required
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = FindNote(entryname);
if (note)
{
Check_Object(note);
note->GetEntry(contents);
return true;
}
if (required)
STOP((
"%s: [%s]%s is a required entry!",
m_notationFile->GetFileName(),
(const char*)m_name,
entryname
));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::SetEntry(
const char *entryname,
const char *contents
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = FindNote(entryname);
if (!note)
note = AddNote(entryname);
Check_Object(note);
note->SetEntry(contents);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::AppendEntry(
const char *entryname,
const char *contents
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = AddNote(entryname);
Check_Object(note);
note->SetEntry(contents);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
Page::GetEntry(
const char *entryname,
int *contents,
bool required
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = FindNote(entryname);
if (note)
{
Check_Object(note);
note->GetEntry(contents);
return true;
}
if (required)
STOP((
"%s: [%s]%s is a required entry!",
m_notationFile->GetFileName(),
m_name,
entryname
));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::SetEntry(
const char *entryname,
int contents
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = FindNote(entryname);
if (!note)
note = AddNote(entryname);
Check_Object(note);
note->SetEntry(contents);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::AppendEntry(
const char *entryname,
int contents
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = AddNote(entryname);
Check_Object(note);
note->SetEntry(contents);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
Page::GetEntry(
const char *entryname,
Scalar *contents,
bool required
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = FindNote(entryname);
if (note)
{
Check_Object(note);
note->GetEntry(contents);
return true;
}
if (required)
STOP((
"%s: [%s]%s is a required entry!",
m_notationFile->GetFileName(),
m_name,
entryname
));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::SetEntry(
const char *entryname,
Scalar value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = FindNote(entryname);
if (!note)
note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::AppendEntry(
const char *entryname,
Scalar value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
Page::GetEntry(
const char *entryname,
DWORD *contents,
bool required
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = FindNote(entryname);
if (note)
{
Check_Object(note);
note->GetEntry(contents);
return true;
}
if (required)
STOP((
"%s: [%s]%s is a required entry!",
m_notationFile->GetFileName(),
m_name,
entryname
));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::SetEntry(
const char *entryname,
DWORD value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = FindNote(entryname);
if (!note)
note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::AppendEntry(
const char *entryname,
DWORD value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
Page::GetEntry(
const char *entryname,
bool *contents,
bool required
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = FindNote(entryname);
if (note)
{
Check_Object(note);
note->GetEntry(contents);
return true;
}
if (required)
STOP((
"%s: [%s]%s is a required entry!",
m_notationFile->GetFileName(),
m_name,
entryname
));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::SetEntry(
const char *entryname,
bool value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = FindNote(entryname);
if (!note)
note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::AppendEntry(
const char *entryname,
bool value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
Page::GetEntry(
const char *entryname,
Vector3D *contents,
bool required
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = FindNote(entryname);
if (note)
{
Check_Object(note);
note->GetEntry(contents);
return true;
}
if (required)
STOP((
"%s: [%s]%s is a required entry!",
m_notationFile->GetFileName(),
m_name,
entryname
));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::SetEntry(
const char *entryname,
const Vector3D &value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = FindNote(entryname);
if (!note)
note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::AppendEntry(
const char *entryname,
const Vector3D &value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
Page::GetEntry(
const char *entryname,
YawPitchRoll *contents,
bool required
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = FindNote(entryname);
if (note)
{
Check_Object(note);
note->GetEntry(contents);
return true;
}
if (required)
STOP((
"%s: [%s]%s is a required entry!",
m_notationFile->GetFileName(),
m_name,
entryname
));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::SetEntry(
const char *entryname,
const YawPitchRoll &value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = FindNote(entryname);
if (!note)
note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::AppendEntry(
const char *entryname,
const YawPitchRoll &value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
Page::GetEntry(
const char *entryname,
UnitQuaternion *contents,
bool required
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = FindNote(entryname);
if (note)
{
Check_Object(note);
note->GetEntry(contents);
return true;
}
if (required)
STOP((
"%s: [%s]%s is a required entry!",
m_notationFile->GetFileName(),
m_name,
entryname
));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::SetEntry(
const char *entryname,
const UnitQuaternion &value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = FindNote(entryname);
if (!note)
note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::AppendEntry(
const char *entryname,
const UnitQuaternion &value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
Page::GetEntry(
const char *entryname,
Motion3D *contents,
bool required
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = FindNote(entryname);
if (note)
{
Check_Object(note);
note->GetEntry(contents);
return true;
}
if (required)
STOP((
"%s: [%s]%s is a required entry!",
m_notationFile->GetFileName(),
m_name,
entryname
));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::SetEntry(
const char *entryname,
const Motion3D &value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = FindNote(entryname);
if (!note)
note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::AppendEntry(
const char *entryname,
const Motion3D &value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
Page::GetEntry(
const char *entryname,
RGBColor *contents,
bool required
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = FindNote(entryname);
if (note)
{
Check_Object(note);
note->GetEntry(contents);
return true;
}
if (required)
STOP((
"%s: [%s]%s is a required entry!",
m_notationFile->GetFileName(),
m_name,
entryname
));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::SetEntry(
const char *entryname,
const RGBColor &value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = FindNote(entryname);
if (!note)
note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::AppendEntry(
const char *entryname,
const RGBColor &value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
Page::GetEntry(
const char *entryname,
RGBAColor *contents,
bool required
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = FindNote(entryname);
if (note)
{
Check_Object(note);
note->GetEntry(contents);
return true;
}
if (required)
STOP((
"%s: [%s]%s is a required entry!",
m_notationFile->GetFileName(),
m_name,
entryname
));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::SetEntry(
const char *entryname,
const RGBAColor &value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = FindNote(entryname);
if (!note)
note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::AppendEntry(
const char *entryname,
const RGBAColor &value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
Page::GetEntry(
const char *entryname,
NotationFile *contents,
bool required
)
{
Check_Object(this);
Check_Pointer(entryname);
Check_Pointer(contents);
Note *note = FindNote(entryname);
if (note)
{
Check_Object(note);
note->GetEntry(contents);
return true;
}
if (required)
STOP((
"%s: [%s]%s is a required entry!",
m_notationFile->GetFileName(),
(char*)m_name,
entryname
));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::SetEntry(
const char *entryname,
NotationFile *value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = FindNote(entryname);
if (!note)
note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::AppendEntry(
const char *entryname,
NotationFile *value
)
{
Check_Object(this);
Check_Pointer(entryname);
Note *note = AddNote(entryname);
Check_Object(note);
note->SetEntry(value);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
Page::TestInstance() const
{
}