mirror of
https://github.com/microsoft/Microsoft-3D-Movie-Maker.git
synced 2024-11-22 02:12:33 +01:00
503 lines
12 KiB
C++
503 lines
12 KiB
C++
/* Copyright (c) Microsoft Corporation.
|
|
Licensed under the MIT License. */
|
|
|
|
/* Copyright (c) Microsoft Corporation.
|
|
Licensed under the MIT License. */
|
|
|
|
/***************************************************************************
|
|
Author: ShonK
|
|
Project: Kauai
|
|
Reviewed:
|
|
Copyright (c) Microsoft Corporation
|
|
|
|
Basic collection classes:
|
|
General List (GL), Allocated List (AL),
|
|
General Group (GG), Allocated Group (AG),
|
|
General String Table (GST), Allocated String Table (AST).
|
|
|
|
BASE ---> GRPB -+-> GLB -+-> GL
|
|
| +-> AL
|
|
|
|
|
+-> GGB -+-> GG
|
|
| +-> AG
|
|
|
|
|
+-> GSTB-+-> GST
|
|
+-> AST
|
|
|
|
***************************************************************************/
|
|
#ifndef GROUPS_H
|
|
#define GROUPS_H
|
|
|
|
|
|
enum
|
|
{
|
|
fgrpNil = 0,
|
|
fgrpShrink = 1,
|
|
};
|
|
|
|
|
|
/****************************************
|
|
GRPB is a virtual class supporting
|
|
all group classes
|
|
****************************************/
|
|
#define GRPB_PAR BASE
|
|
#define kclsGRPB 'GRPB'
|
|
class GRPB : public GRPB_PAR
|
|
{
|
|
RTCLASS_DEC
|
|
ASSERT
|
|
MARKMEM
|
|
|
|
private:
|
|
long _cb1;
|
|
long _cb2;
|
|
HQ _hqData1;
|
|
HQ _hqData2;
|
|
|
|
bool GRPB::_FEnsureHqCb(HQ *phq, long cb, long cbMinGrow, long *pcb);
|
|
|
|
protected:
|
|
long _cbMinGrow1;
|
|
long _cbMinGrow2;
|
|
long _ivMac;
|
|
|
|
byte *_Qb1(long ib)
|
|
{ return (byte *)QvFromHq(_hqData1) + ib; }
|
|
byte *_Qb2(long ib)
|
|
{ return (byte *)QvFromHq(_hqData2) + ib; }
|
|
long _Cb1(void)
|
|
{ return _cb1; }
|
|
long _Cb2(void)
|
|
{ return _cb2; }
|
|
bool _FEnsureSizes(long cbMin1, long cbMin2, ulong grfgrp);
|
|
bool _FWrite(PBLCK pblck, void *pv, long cb, long cb1, long cb2);
|
|
bool _FReadData(PBLCK pblck, long ib, long cb1, long cb2);
|
|
bool _FDup(PGRPB pgrpbDst, long cb1, long cb2);
|
|
|
|
GRPB(void) {}
|
|
|
|
public:
|
|
~GRPB(void);
|
|
|
|
void Lock(void)
|
|
{ if (_hqData1 != hqNil) PvLockHq(_hqData1); }
|
|
void Unlock(void)
|
|
{ if (_hqData1 != hqNil) UnlockHq(_hqData1); }
|
|
long IvMac(void)
|
|
{ return _ivMac; }
|
|
virtual bool FFree(long iv) = 0;
|
|
virtual void Delete(long iv) = 0;
|
|
|
|
//writing
|
|
virtual bool FWriteFlo(PFLO pflo, short bo = kboCur, short osk = koskCur);
|
|
virtual bool FWrite(PBLCK pblck, short bo = kboCur, short osk = koskCur) = 0;
|
|
virtual long CbOnFile(void) = 0;
|
|
};
|
|
|
|
|
|
/****************************************
|
|
GLB is a virtual class supporting
|
|
GL and AL
|
|
****************************************/
|
|
#define GLB_PAR GRPB
|
|
#define kclsGLB 'GLB'
|
|
class GLB : public GLB_PAR
|
|
{
|
|
RTCLASS_DEC
|
|
ASSERT
|
|
|
|
protected:
|
|
long _cbEntry;
|
|
|
|
GLB(long cb);
|
|
|
|
public:
|
|
long CbEntry(void)
|
|
{ return _cbEntry; }
|
|
void *QvGet(long iv);
|
|
void Get(long iv, void *pv);
|
|
void Put(long iv, void *pv);
|
|
void *PvLock(long iv);
|
|
void SetMinGrow(long cvAdd);
|
|
|
|
virtual bool FAdd(void *pv, long *piv = pvNil) = 0;
|
|
};
|
|
|
|
|
|
/****************************************
|
|
GL is the basic dynamic array
|
|
****************************************/
|
|
#define GL_PAR GLB
|
|
#define kclsGL 'GL'
|
|
class GL : public GL_PAR
|
|
{
|
|
RTCLASS_DEC
|
|
|
|
protected:
|
|
GL(long cb);
|
|
bool _FRead(PBLCK pblck, short *pbo, short *posk);
|
|
|
|
public:
|
|
// static methods
|
|
static PGL PglNew(long cb, long cvInit = 0);
|
|
static PGL PglRead(PBLCK pblck, short *pbo = pvNil, short *posk = pvNil);
|
|
static PGL PglRead(PFIL pfil, FP fp, long cb,
|
|
short *pbo = pvNil, short *posk = pvNil);
|
|
|
|
// duplication
|
|
PGL PglDup(void);
|
|
|
|
// methods required by parent class
|
|
virtual bool FAdd(void *pv, long *piv = pvNil);
|
|
virtual void Delete(long iv);
|
|
virtual bool FWrite(PBLCK pblck, short bo = kboCur, short osk = koskCur);
|
|
virtual long CbOnFile(void);
|
|
virtual bool FFree(long iv);
|
|
|
|
// new methods
|
|
void Delete(long iv, long cv);
|
|
bool FInsert(long iv, void *pv = pvNil, long cv = 1);
|
|
bool FSetIvMac(long ivMacNew);
|
|
bool FEnsureSpace(long cvAdd, ulong grfgrp = fgrpNil);
|
|
void Move(long ivSrc, long ivTarget);
|
|
bool FPush(void *pv)
|
|
{ return FInsert(_ivMac, pv); }
|
|
bool FPop(void *pv = pvNil);
|
|
bool FEnqueue(void *pv)
|
|
{ return FInsert(0, pv); }
|
|
bool FDequeue(void *pv = pvNil)
|
|
{ return FPop(pv); }
|
|
};
|
|
|
|
|
|
/****************************************
|
|
Allocated (fixed index) list class
|
|
****************************************/
|
|
#define AL_PAR GLB
|
|
#define kclsAL 'AL'
|
|
class AL : public AL_PAR
|
|
{
|
|
RTCLASS_DEC
|
|
ASSERT
|
|
|
|
private:
|
|
long _cvFree;
|
|
|
|
private:
|
|
//section 2 of the data contains a bit array
|
|
byte *_Qgrfbit(long iv)
|
|
{ return _Qb2(IbFromIbit(iv)); }
|
|
|
|
protected:
|
|
AL(long cb);
|
|
bool _FRead(PBLCK pblck, short *pbo, short *posk);
|
|
|
|
public:
|
|
// static methods
|
|
static PAL PalNew(long cb, long cvInit = 0);
|
|
static PAL PalRead(PBLCK pblck, short *pbo = pvNil, short *posk = pvNil);
|
|
static PAL PalRead(PFIL pfil, FP fp, long cb,
|
|
short *pbo = pvNil, short *posk = pvNil);
|
|
|
|
// duplication
|
|
PAL PalDup(void);
|
|
|
|
// methods required by parent class
|
|
virtual bool FAdd(void *pv, long *piv = pvNil);
|
|
virtual void Delete(long iv);
|
|
virtual bool FWrite(PBLCK pblck, short bo = kboCur, short osk = koskCur);
|
|
virtual long CbOnFile(void);
|
|
virtual bool FFree(long iv);
|
|
|
|
// new methods
|
|
bool FEnsureSpace(long cvAdd, ulong grfgrp = fgrpNil);
|
|
void DeleteAll(void);
|
|
};
|
|
|
|
|
|
/****************************************
|
|
GGB is a virtual class supporting
|
|
GG and AG
|
|
****************************************/
|
|
const BOM kbomLoc = 0xF0000000;
|
|
#define GGB_PAR GRPB
|
|
#define kclsGGB 'GGB'
|
|
class GGB : public GGB_PAR
|
|
{
|
|
RTCLASS_DEC
|
|
ASSERT
|
|
|
|
protected:
|
|
struct LOC
|
|
{
|
|
long bv;
|
|
long cb;
|
|
};
|
|
|
|
long _bvMac;
|
|
long _clocFree;
|
|
long _cbFixed;
|
|
|
|
protected:
|
|
GGB(long cbFixed, bool fAllowFree);
|
|
|
|
void _RemoveRgb(long bv, long cb);
|
|
void _AdjustLocs(long bvMin, long bvLim, long dcb);
|
|
LOC *_Qloc(long iloc)
|
|
{ return (LOC *)_Qb2(LwMul(iloc, size(LOC))); }
|
|
bool _FRead(PBLCK pblck, short *pbo, short *posk);
|
|
|
|
bool _FDup(PGGB pggbDst);
|
|
|
|
public:
|
|
// methods required by parent class
|
|
virtual bool FWrite(PBLCK pblck, short bo = kboCur, short osk = koskCur);
|
|
virtual long CbOnFile(void);
|
|
virtual bool FFree(long iv);
|
|
|
|
bool FEnsureSpace(long cvAdd, long cbAdd, ulong grfgrp = fgrpNil);
|
|
void SetMinGrow(long cvAdd, long cbAdd);
|
|
|
|
virtual bool FAdd(long cb, long *piv = pvNil,
|
|
void *pv = pvNil, void *pvFixed = pvNil) = 0;
|
|
|
|
//access to the fixed portion
|
|
long CbFixed(void)
|
|
{ return _cbFixed; }
|
|
void *QvFixedGet(long iv, long *pcbVar = pvNil);
|
|
void *PvFixedLock(long iv, long *pcbVar = pvNil);
|
|
void GetFixed(long iv, void *pv);
|
|
void PutFixed(long iv, void *pv);
|
|
|
|
//access to the variable portion
|
|
long Cb(long iv);
|
|
void *QvGet(long iv, long *pcb = pvNil);
|
|
void *PvLock(long iv, long *pcb = pvNil);
|
|
void Get(long iv, void *pv);
|
|
void Put(long iv, void *pv);
|
|
bool FPut(long iv, long cb, void *pv);
|
|
void GetRgb(long iv, long bv, long cb, void *pv);
|
|
void PutRgb(long iv, long bv, long cb, void *pv);
|
|
void DeleteRgb(long iv, long bv, long cb);
|
|
bool FInsertRgb(long iv, long bv, long cb, void *pv);
|
|
bool FMoveRgb(long ivSrc, long bvSrc, long ivDst, long bvDst, long cb);
|
|
void Merge(long ivSrc, long ivDst);
|
|
};
|
|
|
|
|
|
/****************************************
|
|
General Group - based on GGB
|
|
****************************************/
|
|
#define GG_PAR GGB
|
|
#define kclsGG 'GG'
|
|
class GG : public GG_PAR
|
|
{
|
|
RTCLASS_DEC
|
|
ASSERT
|
|
|
|
protected:
|
|
GG(long cbFixed) : GGB(cbFixed, fFalse) {}
|
|
|
|
public:
|
|
// static methods
|
|
static PGG PggNew(long cbFixed = 0, long cvInit = 0, long cbInit = 0);
|
|
static PGG PggRead(PBLCK pblck, short *pbo = pvNil, short *posk = pvNil);
|
|
static PGG PggRead(PFIL pfil, FP fp, long cb,
|
|
short *pbo = pvNil, short *posk = pvNil);
|
|
|
|
// duplication
|
|
PGG PggDup(void);
|
|
|
|
// methods required by parent class
|
|
virtual bool FAdd(long cb, long *piv = pvNil,
|
|
void *pv = pvNil, void *pvFixed = pvNil);
|
|
virtual void Delete(long iv);
|
|
|
|
// new methods
|
|
bool FInsert(long iv, long cb, void *pv = pvNil, void *pvFixed = pvNil);
|
|
bool FCopyEntries(PGG pggSrc, long ivSrc, long ivDst, long cv);
|
|
void Move(long ivSrc, long ivTarget);
|
|
void Swap(long iv1, long iv2);
|
|
};
|
|
|
|
|
|
/****************************************
|
|
Allocated Group - based on GGB
|
|
****************************************/
|
|
#define AG_PAR GGB
|
|
#define kclsAG 'AG'
|
|
class AG : public AG_PAR
|
|
{
|
|
RTCLASS_DEC
|
|
ASSERT
|
|
|
|
protected:
|
|
AG(long cbFixed) : GGB(cbFixed, fTrue) {}
|
|
|
|
public:
|
|
// static methods
|
|
static PAG PagNew(long cbFixed = 0, long cvInit = 0, long cbInit = 0);
|
|
static PAG PagRead(PBLCK pblck, short *pbo = pvNil, short *posk = pvNil);
|
|
static PAG PagRead(PFIL pfil, FP fp, long cb,
|
|
short *pbo = pvNil, short *posk = pvNil);
|
|
|
|
// duplication
|
|
PAG PagDup(void);
|
|
|
|
// methods required by parent class
|
|
virtual bool FAdd(long cb, long *piv = pvNil,
|
|
void *pv = pvNil, void *pvFixed = pvNil);
|
|
virtual void Delete(long iv);
|
|
};
|
|
|
|
|
|
|
|
/****************************************
|
|
String table classes
|
|
****************************************/
|
|
enum
|
|
{
|
|
fgstNil = 0,
|
|
fgstSorted = 1,
|
|
fgstUserSorted = 2,
|
|
fgstAllowFree = 4,
|
|
};
|
|
|
|
const long kcchMaxGst = kcchMaxStn;
|
|
|
|
|
|
/****************************************
|
|
GSTB is a virtual class supporting
|
|
GST and AST.
|
|
****************************************/
|
|
#define GSTB_PAR GRPB
|
|
#define kclsGSTB 'GSTB'
|
|
class GSTB : public GSTB_PAR
|
|
{
|
|
RTCLASS_DEC
|
|
ASSERT
|
|
|
|
protected:
|
|
long _cbEntry;
|
|
long _bstMac;
|
|
long _cbstFree; //this is cvNil for non-allocated GSTBs
|
|
|
|
protected:
|
|
GSTB(long cbExtra, ulong grfgst);
|
|
|
|
long _Bst(long ibst)
|
|
{ return *(long *)_Qb2(LwMul(ibst, _cbEntry)); }
|
|
long *_Qbst(long ibst)
|
|
{ return (long *)_Qb2(LwMul(ibst, _cbEntry)); }
|
|
PST _Qst(long ibst);
|
|
void _RemoveSt(long bst);
|
|
void _AppendRgch(achar *prgch, long cch);
|
|
void _SwapBytesRgbst(void);
|
|
void _TranslateGrst(short osk, bool fToCur);
|
|
bool _FTranslateGrst(short osk);
|
|
bool _FRead(PBLCK pblck, short *pbo, short *posk);
|
|
|
|
bool _FDup(PGSTB pgstbDst);
|
|
|
|
public:
|
|
// methods required by parent class
|
|
virtual bool FWrite(PBLCK pblck, short bo = kboCur, short osk = koskCur);
|
|
virtual long CbOnFile(void);
|
|
virtual bool FFree(long istn);
|
|
|
|
bool FEnsureSpace(long cstnAdd, long cchAdd, ulong grfgrp = fgrpNil);
|
|
void SetMinGrow(long cstnAdd, long cchAdd);
|
|
|
|
virtual bool FAddRgch(achar *prgch, long cch,
|
|
void *pvExtra = pvNil, long *pistn = pvNil) = 0;
|
|
virtual bool FFindRgch(achar *prgch, long cch, long *pistn,
|
|
ulong grfgst = fgstNil);
|
|
|
|
long IstnMac(void)
|
|
{ return _ivMac; }
|
|
long CbExtra(void)
|
|
{ return _cbEntry - size(long); }
|
|
|
|
bool FAddStn(PSTN pstn, void *pvExtra = pvNil, long *pistn = pvNil);
|
|
bool FPutRgch(long istn, achar *prgch, long cch);
|
|
bool FPutStn(long istn, PSTN pstn);
|
|
void GetRgch(long istn, achar *prgch, long cchMax, long *pcch);
|
|
void GetStn(long istn, PSTN pstn);
|
|
bool FFindStn(PSTN pstn, long *pistn, ulong grfgst = fgstNil);
|
|
|
|
void GetExtra(long istn, void *pv);
|
|
void PutExtra(long istn, void *pv);
|
|
bool FFindExtra(void *prgbFind, PSTN pstn = pvNil, long *pistn = pvNil);
|
|
};
|
|
|
|
|
|
/****************************************
|
|
String table
|
|
****************************************/
|
|
#define GST_PAR GSTB
|
|
#define kclsGST 'GST'
|
|
class GST : public GST_PAR
|
|
{
|
|
RTCLASS_DEC
|
|
ASSERT
|
|
|
|
protected:
|
|
GST(long cbExtra) : GSTB(cbExtra, fgstNil) {}
|
|
|
|
public:
|
|
// static methods
|
|
static PGST PgstNew(long cbExtra = 0, long cstnInit = 0, long cchInit = 0);
|
|
static PGST PgstRead(PBLCK pblck, short *pbo = pvNil, short *posk = pvNil);
|
|
static PGST PgstRead(PFIL pfil, FP fp, long cb,
|
|
short *pbo = pvNil, short *posk = pvNil);
|
|
|
|
// duplication
|
|
PGST PgstDup(void);
|
|
|
|
// methods required by parent class
|
|
virtual bool FAddRgch(achar *prgch, long cch,
|
|
void *pvExtra = pvNil, long *pistn = pvNil);
|
|
virtual bool FFindRgch(achar *prgch, long cch, long *pistn,
|
|
ulong grfgst = fgstNil);
|
|
virtual void Delete(long istn);
|
|
|
|
// new methods
|
|
bool FInsertRgch(long istn, achar *prgch, long cch, void *pvExtra = pvNil);
|
|
bool FInsertStn(long istn, PSTN pstn, void *pvExtra = pvNil);
|
|
void Move(long istnSrc, long istnDst);
|
|
};
|
|
|
|
|
|
/****************************************
|
|
Allocated string table
|
|
****************************************/
|
|
#define AST_PAR GSTB
|
|
#define kclsAST 'AST'
|
|
class AST : public AST_PAR
|
|
{
|
|
RTCLASS_DEC
|
|
ASSERT
|
|
|
|
protected:
|
|
AST(long cbExtra) : GSTB(cbExtra, fgstAllowFree) {}
|
|
|
|
public:
|
|
// static methods
|
|
static PAST PastNew(long cbExtra = 0, long cstnInit = 0, long cchInit = 0);
|
|
static PAST PastRead(PBLCK pblck, short *pbo = pvNil, short *posk = pvNil);
|
|
static PAST PastRead(PFIL pfil, FP fp, long cb,
|
|
short *pbo = pvNil, short *posk = pvNil);
|
|
|
|
// duplication
|
|
PAST PastDup(void);
|
|
|
|
// methods required by parent class
|
|
virtual bool FAddRgch(achar *prgch, long cch,
|
|
void *pvExtra = pvNil, long *pistn = pvNil);
|
|
virtual void Delete(long istn);
|
|
};
|
|
|
|
|
|
#endif //!GROUPS_H
|
|
|