Main Page Class Hierarchy Compound List File List Compound Members File Members

SLContext.cc

Go to the documentation of this file.
00001 /*
00002 File: SLContext.cc
00003 
00004 Function: See header file
00005 
00006 Author(s): Andrew Willmott
00007 
00008 Copyright: (c) 1995-2000, Andrew Willmott
00009 
00010 Notes: 
00011 
00012 */
00013 
00014 
00015 #include "gcl/SLContext.h"
00016 
00029  const UInt16 slc_EOL = 0x8000;
00030  const UInt16 slc_DaemonFlag = 0x4000;
00031  const UInt16 slc_LevelMask = 0x0FFF;
00032 
00033 
00034  SLContext::SLContext(Int numAttrs) :
00035 attributeList(numAttrs),
00036 attributeStack()
00037 {
00038 Clear();
00039 }
00040 
00041  AttrPtr SLContext::Get(AttrType attrType)
00042 {
00043 if (attributeList[attrType].level & slc_DaemonFlag)
00044 return(attributeList[attrType].daemon->Get());
00045 else
00046 return(attributeList[attrType].data); 
00047 }
00048 
00049  Void SLContext::Set(AttrType attrType, AttrPtr attrPtr)
00050 {
00051 Assert(attrType < attributeList.NumItems(),
00052 "(SLContext::Set) Unknown attribute type");
00053 AttrRec *pRec = &attributeList[attrType];
00054 AttrStackRec sRec;
00055 Bool isDaemon = (pRec->level & slc_DaemonFlag);
00056 
00057 // if the attribute exists and wasn't set this level, push it...
00058 
00059 if (pRec->data && (pRec->level & slc_LevelMask) < level)
00060 {
00061 sRec.attrRec = *pRec;
00062 sRec.attrType = attrType;
00063 
00064 if (isDaemon)
00065 pRec->daemon->Save();
00066 
00067 attributeStack.Push(sRec);
00068 }
00069 
00070 if (isDaemon)
00071 pRec->daemon->Set(attrPtr);
00072 else
00073 pRec->data = attrPtr;
00074 
00075 pRec->level = level;
00076 }
00077 
00078  Void SLContext::SetDaemon(AttrType attrType, AttrDaemon *daemon)
00079 {
00080 Assert((attributeList[attrType].level & slc_DaemonFlag) == 0, "Daemon already set for this slot.");
00081 
00082 Set(attrType, daemon);
00083 
00084 if (daemon)
00085 attributeList[attrType].level |= slc_DaemonFlag;
00086 }
00087 
00088  Void SLContext::Push()
00089 {
00090 AttrStackRec sRec;
00091 
00092 level++;
00093 sRec.attrRec.level = slc_EOL; // mark pRec as a sentinel
00094 attributeStack.Push(sRec); // Add to the stack
00095 }
00096 
00097  Void SLContext::Pop()
00098 {
00099 Int i;
00100 
00101 // pop off all the attributes changed since the last push...
00102 
00103 Assert(level > 0, "(SLContext::Pop) Too many pops");
00104 
00105 while (!(attributeStack.Top().attrRec.level & slc_EOL)) 
00106 {
00107 if (attributeStack.Top().attrRec.level & slc_DaemonFlag)
00108 attributeStack.Top().attrRec.daemon->Restore(); 
00109 
00110 attributeList[attributeStack.Top().attrType] =
00111 attributeStack.Top().attrRec;
00112 attributeStack.Pop();
00113 }
00114 
00115 // pop off the sentinel...
00116 
00117 attributeStack.Pop();
00118 level--;
00119 
00120 // zero anything that wasn't previously set at this level.
00121 
00122 for (i = 0; i < attributeList.NumItems(); i++)
00123 if ((attributeList[i].level & slc_LevelMask) > level)
00124 {
00125 attributeList[i].data = 0;
00126 attributeList[i].level = 0;
00127 }
00128 }
00129 
00130  Bool SLContext::IsCurrent(AttrType attrType)
00131 {
00132 return(attributeList[attrType].level == level);
00133 }
00134 
00135  Void SLContext::Clear()
00136 {
00137 Int i;
00138 
00139 attributeStack.SetSize(0);
00140 level = 0;
00141 
00142 for (i = 0; i < attributeList.NumItems(); i++)
00143 {
00144 attributeList[i].level = 0; 
00145 attributeList[i].data = 0;
00146 } 
00147 }
00148 
00149  ostream &operator << (ostream &s, const AttrRec &ar)
00150 {
00151 s << ar.data << "@" << ar.level;
00152 
00153 return(s);
00154 }
00155 
00156  ostream &operator << (ostream &s, const AttrStackRec &asr)
00157 {
00158 s << asr.attrRec << ":" << asr.attrType;
00159 
00160 return(s);
00161 }
00162 
00163  ostream &operator << (ostream &s, const SLContext &ctx)
00164 {
00165 s << "SLContext at level " << ctx.level << ". Current attributes: " << endl;
00166 s << (AttrList &) ctx.attributeList << endl;
00167 s << "Attribute stack: " << endl << (AttrStackList &) ctx.attributeStack << endl;
00168 
00169 return(s);
00170 }
00171 
00172 

Generated at Sat Aug 5 00:17:03 2000 for Graphics Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000

AltStyle によって変換されたページ (->オリジナル) /