00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "g-map-generic.hh"
00026 #include "alt-stdint.hh"
00027 using namespace GMap3d;
00028
00029 void CGMapGeneric::allocMemoryToDirectInfo(int AMarkNumber,
00030 int ADirectInfoIndex,
00031 int ABytes, TOrbit AOrbitUsed)
00032 {
00033 assert(ABytes>0);
00034
00035 if (AOrbitUsed==ORBIT_NONE)
00036 {
00037 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00038 if (isMarked(*it, AMarkNumber))
00039 setDirectInfo(*it, ADirectInfoIndex, new uint8_t[ABytes]);
00040 }
00041 else
00042 {
00043 assert(isOrbitUsed(AOrbitUsed));
00044 int treated = getNewMark();
00045
00046 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00047 if (!isMarked(*it, treated))
00048 {
00049 if (isMarked(*it, AMarkNumber))
00050 {
00051 CDart * owner = getEmbeddingOwner(*it, AOrbitUsed);
00052 assert(owner!=NULL);
00053
00054 setDirectInfo(owner, ADirectInfoIndex, new uint8_t[ABytes]);
00055
00056 markOrbit(owner, AOrbitUsed, treated);
00057 }
00058 else
00059 setMark(*it, treated);
00060 }
00061
00062 negateMaskMark(treated);
00063 freeMark(treated);
00064 }
00065 }
00066
00067 void CGMapGeneric::allocMemoryToDirectInfo(CDart * ADart, TOrbit AOrbit,
00068 int ADirectInfoIndex,
00069 int ABytes, TOrbit AOrbitUsed)
00070 {
00071 assert(ADart!=NULL);
00072
00073 int mark = getNewMark();
00074
00075 markOrbit(ADart, AOrbit, mark);
00076 allocMemoryToDirectInfo(mark, ADirectInfoIndex, ABytes, AOrbitUsed);
00077 unmarkOrbit(ADart, AOrbit, mark);
00078
00079 freeMark(mark);
00080 }
00081
00082 void CGMapGeneric::freeMemoryFromDirectInfo(int AMarkNumber,
00083 int ADirectInfoIndex,
00084 TOrbit AOrbitUsed)
00085 {
00086 if (AOrbitUsed==ORBIT_NONE)
00087 {
00088 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00089 if (isMarked(*it, AMarkNumber))
00090 delete (uint8_t *) getDirectInfo(*it, ADirectInfoIndex);
00091 }
00092 else
00093 {
00094 assert(isOrbitUsed(AOrbitUsed));
00095 int treated = getNewMark();
00096
00097 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00098 if (!isMarked(*it, treated))
00099 {
00100 if (isMarked(*it, AMarkNumber))
00101 {
00102 CDart * owner = getEmbeddingOwner(*it, AOrbitUsed);
00103 assert(owner!=NULL);
00104
00105 delete (uint8_t *) getDirectInfo(owner, ADirectInfoIndex);
00106
00107 markOrbit(owner, AOrbitUsed, treated);
00108 }
00109 else
00110 setMark(*it, treated);
00111 }
00112
00113 negateMaskMark(treated);
00114 freeMark(treated);
00115 }
00116 }
00117
00118 void CGMapGeneric::freeMemoryFromDirectInfo(CDart * ADart, TOrbit AOrbit,
00119 int ADirectInfoIndex,
00120 TOrbit AOrbitUsed )
00121 {
00122 assert(ADart!=NULL);
00123
00124 int mark = getNewMark();
00125
00126 markOrbit(ADart, AOrbit, mark);
00127 freeMemoryFromDirectInfo(mark, ADirectInfoIndex, AOrbitUsed);
00128 unmarkOrbit(ADart, AOrbit, mark);
00129
00130 freeMark(mark);
00131 }
00132
00133 void CGMapGeneric::saveAlphaInDirectInfo(int AAlphaIndex, int ADirectInfoIndex)
00134 {
00135 assert(0 <= AAlphaIndex && AAlphaIndex <= 3);
00136
00137 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00138 setDirectInfo(*it, ADirectInfoIndex, alpha(*it, AAlphaIndex));
00139 }
00140