In XMLScanner we have the following code....
// ---------------------------------------------------------------------------
void XMLScanner::scanDocument( const XMLCh* const systemId
, const bool reuseValidator)
{
//
// First we try to parse it as a URL. If that fails, we assume its
// a file and try it that way.
//
InputSource* srcToUse = 0;
try
{
//
// Create a temporary URL. Since this is the primary document,
// it has to be fully qualified. If not, then assume we are just
// mistaking a file for a URL.
//
XMLURL tmpURL(systemId);
if (tmpURL.isRelative())
ThrowXML(MalformedURLException,
XML4CExcepts::URL_NoProtocolPresent);
srcToUse = new URLInputSource(tmpURL);
}
catch(const MalformedURLException&)
{
srcToUse = new LocalFileInputSource(systemId);
}
catch(...)
{
// Just rethrow this, since its not our problem
throw;
}
Janitor<InputSource> janSrc(srcToUse);
scanDocument(*srcToUse, reuseValidator);
}
Using exceptions to branch code is quite expensive in C++ - it's better to use
an if statement if one can i.e. (or am I missing something that throwing an
exception
does that's useful - some one with greater familiarity with the code could
probably speak
on that)
void XMLScanner::scanDocument( const XMLCh* const systemId
, const bool reuseValidator)
{
//
// First we try to parse it as a URL. If that fails, we assume its
// a file and try it that way.
//
InputSource* srcToUse = 0;
XMLURL tmpURL(systemId);
if (!tmpURL.isRelative())
{
srcToUse = new URLInputSource(tmpURL);
}
else
{
srcToUse = new LocalFileInputSource(systemId);
}
Janitor<InputSource> janSrc(srcToUse);
scanDocument(*srcToUse, reuseValidator);
}
I like the Janitor idea - have you considered the concept of a reference
counted class - it's
quite handy since you can have several "smart pointers" pointing to it from a
bunch of different
objects - when no one references the object it destroys itself (a little bit
like Java)
First define the class you want to safely deallocate as inheriting from a class
like COLreference
Then use a "smart pointer" COLreferencePtr to point it i.e
class InputSource : public COLreference
{
:
:
}
void XMLScanner::scanDocument( const XMLCh* const systemId
, const bool reuseValidator)
{
//
// First we try to parse it as a URL. If that fails, we assume its
// a file and try it that way.
//
COLreferencePtr<InputSource> srcToUse = 0;
XMLURL tmpURL(systemId);
if (!tmpURL.isRelative())
{
srcToUse = new URLInputSource(tmpURL);
}
else
{
srcToUse = new LocalFileInputSource(systemId);
}
scanDocument(*srcToUse, reuseValidator);
// now no need to remember to assign a Janitor to look after de-allocation
// it also has the advantage that serveral smart pointers can be pointed to
the same object
// and thus it never is destroyed before each has finished with it.
}
COLreferencePtr<InputSource> pSource = 0;
pSource = new InputSource;
class COLreference
{
public:
COLreference();
virtual ~COLreference();
void AddRef() const;
void Release() const;
protected:
size_t m_CountOfRef;
};
inline COLreference::COLreference()
: m_CountOfRef(0)
{
// do nothing
}
inline COLreference::~COLreference()
{
COLPRECONDITION(0 == m_CountOfRef);
}
inline void COLreference::AddRef() const
{
((COLreference*)this)->m_CountOfRef++;
}
inline void COLreference::Release() const
{
COLPRECONDITION(m_CountOfRef > 0);
((COLreference*)this)->m_CountOfRef--;
if (0 == m_CountOfRef)
{
delete (COLreference*)this; // good bye cruel world...!
}
}
template<class R>
class COLreferencePtr : public COLinstanceHeap
{
public:
COLreferencePtr(R* Reference = NULL);
~COLreferencePtr();
R* operator=(R* Reference);
R& operator*();
const R& operator*() const;
R* operator->();
const R* operator->() const;
void clone();
R* get() const { return m_Ptr; }
COLreferencePtr<R>& operator=(const COLreferencePtr<R>& Orig);
private:
R* m_Ptr;
};
template<class R>
inline COLreferencePtr<R>::COLreferencePtr(R* Reference)
{
m_Ptr = Reference;
if (m_Ptr != NULL)
{
m_Ptr->AddRef();
}
}
template<class R>
inline COLreferencePtr<R>::~COLreferencePtr()
{
if (m_Ptr)
{
m_Ptr->Release();
}
}
template<class R>
inline R* COLreferencePtr<R>::operator=(R* pReference)
{
// This has to go before - imagine if pReference == m_Ptr
if (pReference != NULL)
{
pReference->AddRef();
}
if (m_Ptr)
{
m_Ptr->Release();
}
m_Ptr = pReference;
return m_Ptr;
}
template<class R>
inline R& COLreferencePtr<R>::operator*()
{
return *m_Ptr;
}
template<class R>
inline const R& COLreferencePtr<R>::operator*() const
{
return *m_Ptr;
}
template<class R>
inline R* COLreferencePtr<R>::operator->()
{
return m_Ptr;
}
template<class R>
inline const R* COLreferencePtr<R>::operator->() const
{
return m_Ptr;
}
template<class R>
inline void COLreferencePtr<R>::clone()
{
if (m_Ptr == NULL)
{
return;
}
COLreference* pClone = m_Ptr->clone();
pClone->AddRef();
m_Ptr->Release();
m_Ptr = (R*)pClone;
}
template<class R>
inline COLreferencePtr<R>& COLreferencePtr<R>::operator=(const
COLreferencePtr<R>& Orig)
{
if (Orig.m_Ptr)
{
Orig.m_Ptr->AddRef();
}
if (m_Ptr)
{
m_Ptr->Release();
}
m_Ptr = Orig.m_Ptr;
return *this;
}
--
Eliot Muir, Technical Director iNTERFACEWARE
mailto:[EMAIL PROTECTED]
Voice 64-21-333068 http://www.interfaceware.com
Makers of iNTERFACEWARE Chameleon
"Program to the iNTERFACE not the implementation"
begin 600 WINMAIL.DAT
M>)\^(C<``0:0" `$```````!``$``0>[EMAIL PROTECTED](````Y 0```````#H``$(@ <`
M& ```$E032Y-:6-R;[EMAIL PROTECTED];"Y.;W1E`#$(`0V ! `"[EMAIL PROTECTED]"``$$
MD 8`T $```$````0`````P``, (````+``\.``````(!_P\!````40``````
M``"!*Q^DOJ,0&9UN`-T!#U0"`````'AE<F-E<RUD979 >&UL+F%P86-H92YO
M<F<`4TU44 !X97)C97,M9&5V0'AM;"YA<&%C:&4N;W)G`````!X``C !````
M!0```%--5% `````'@`#, $````:````>&5R8V5S+61E=D!X;6PN87!A8VAE
M+F]R9P````,`%0P!`````P#^#P8````>``$P`0```!P````G>&5R8V5S+61E
M=D!X;6PN87!A8VAE+F]R9R<[EMAIL PROTECTED], $````?````4TU44#I815)#15,M1$56
M0%A-3"Y!4$%#2$4N3U)'```#```Y``````L`0#H!````'@#V7P$````:````
M>&5R8V5S+61E=D!X;6PN87!A8VAE+F]R9P````(!]U\!````40````````"!
M*Q^DOJ,0&9UN`-T!#U0"`````'AE<F-E<RUD979 >&UL+F%P86-H92YO<F<`
M4TU44 !X97)C97,M9&5V0'AM;"YA<&%C:&4N;W)G``````,`_5\!`````P#_
M7P`````"`?8/`0````0````````"468!!( !`# ```!834Q38V%N;F5R(&-O
M9&4N+BX@:7,@=&AI<R!E>&-E<'1I;VX@;F5C97-S87)Y/P#O$ $%@ ,[EMAIL PROTECTED]
M`- '! `&``P`$0`U``0`-P$!(( [EMAIL PROTECTED]'@[EMAIL PROTECTED]
M`0`A````1#4W,44P14(R0C!"1#0Q,4$W1#4P,$$P,$,Q,S%%-S,`%@<!`Y &
M`)0-```A````"P`"``$````+`",```````,`)@``````"P`I```````#`"X`
M``````,[EMAIL PROTECTED] `Y`( 'NHQ=G[\!'@!P``$````P````6$U,4V-A;FYE
M<B!C;V1E+BXN(&ES('1H:7,@97AC97!T:6]N(&YE8V5S<V%R>[EMAIL PROTECTED]
M```6`````;[EMAIL PROTECTED]"@#!,><P``'@`># $````%````4TU4
M4 `````>`!\,`0```!T```!E;&EO="YM=6ER0&EN=&5R9F%C97=A<F4N8V]M
M``````,[EMAIL PROTECTED];`P`'$ T1```>[EMAIL PROTECTED]&4```!)3EA-3%-#04Y.15)7
M14A!5D542$5&3TQ,3U=)3D=#3T1%+R\M+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM````
M``(!"1 !````60H``%4*```''@``3%I&=4>]\:UW``H!`P'W( *D`^,"`&."
M: K <V5T," '$X\"@P!0`O(/651A: -QA0*#,@[G<')Q,@_V)GT*@ C((#L)
M;S(U9C4"@ J!=6,`4 L#8P,`00M@;F<Q,#,S"0NF($D#H%A-3%,*8P!P;@20
M('=E(&4/@'89$'1H&1 "$&RW"0`#\!<P( [EMAIL PROTECTED]&J&'"J(*A J [EMAIL
PROTECTED]
M'QSO'?\?#Q]T&N1V;VDR9!A).CH$\ !P1&_,8W4'@ (P*" :40" 1P5 (L 8
M44-H*B+7(,1S>2,096U)"S$;`O<D(B5_)CDL(M4&X ;P)CHU"7!U#[!6!T A
M`&[EMAIL PROTECTED]&:[EMAIL PROTECTED] 9`71R>9D9<&\@"K$/L"!I!4 "
[EMAIL PROTECTED]/[EMAIL PROTECTED] 9L MP;'/W)T 9`2U@<R)A+2$/0"L+[2V09@,0
M+P%N(1 L8BTQ<2XS=V%Y&M4JGA@@<$AU=%,(86-E([!S$30P5&]5+0$](#!_
M%* D]BQA)[EMAIL PROTECTED]&BJ>*U9#WPEP*6 O`1EP)*!P!; *P/LL@"VS4PN -$ 9<00`
M+2!?!" [EMAIL PROTECTED],`!W YXF0B12Q?-]\M(@^ .S$LL&(9H77S&> L@'%U*2$PP F
M+>/\;[EMAIL PROTECTED] O)2[R"7"4(&HHX'0\KR!M! #]`9!K&B(PI0(0!< ME#;?
MOR3[&%$ML1EP.: [EMAIL PROTECTED]@F,P:0("A&M"Y)! [EMAIL PROTECTED]&D94"BF*2FE
M)CI4: [EMAIL PROTECTED]"A-!T!#P0> 9"VQ179X-$ %,&D"("= &%$T&D-,E',AT"VQ
M7TYO_E #8"EP".%.@ >0(H%'KG\TB1C !^ ML3.Y2-5'JERN?1KJ)"(8D'0/
M<"@BY+M+WTSB)DH9-KY0?4PB0/\'0"O0,.!1FD<O4T]46!JA^U:_.!M*06$H
ML1F 2V$ZP]\G0 "0.I(OD3_"( AA.X%^;P)@)*!*+%_C6S\E)$K7`' M, 6P
M/#.Y/D% `'"^4S0P6I TE4>J(?LJ-(:_)T HS35%6^8TT!HB94RF]SX4.= Z
MD&@:4SL2/O M,/L9$&N0< GP`) 940N ..#L*RL;P"TA)P0@/F "0/\8T2RA
M*.$:Y .12*%"T221OR*!2)("(!D0&)$M("X:D'4BP"A#TFT8$$*B:T-S_P-P
M7]$:(BXS7^-#$P.@:Y?_&N0\$ >1+C)O$2CA/I%NP>]SDG&3`_ 9@" )P3DA
M!<#_+H!"L"DP"L M,"R >!,[EMAIL PROTECTED]@/J A$&'"`: ^P7/_;>!"\!KD`B N
M(RFF"[EMAIL PROTECTED]/(]]*+X*_)P\H'RDO_S)?*T\L7RUO+G\OCS"?,:^_,K\S
MSS3?1C]:STB3(4CO_TG[7DU0?U&/4I^!QY70;_;_EM^7WUE/6E^:CV2O9;]F
MS[]GWVCO:?]\W'[EMAIL PROTECTED]&62_H>6)\ $`BF!NT!DS>[EMAIL PROTECTED])<7GE.I$%
M,6^*X/N*8 EP9JN!.I)[EMAIL PROTECTED](PJZ'[EMAIL PROTECTED];60/@(WP_WM1.H.JXP.1
M&3,/L!E0.=#Y`R B<SO!!4 YL N ;W'\<R*Q]'/SB8"*`0-2BE'N8JV@;+&L
MD60&D*T#087=8>!J!9!A$6[0=T R/]#_<9.LYSLTM82)[EMAIL PROTECTED] #8/^!0(Q2
ME=!([EMAIL PROTECTED]@`"0(VQSF**`:D3H>!V87R9"H#_B*0!`0N &62N!*KBCN!Q0?F)
M<7-AK0`^P:HQ&>%4D?^+TFY1&9!Y41HBLY6N!*D3^$-/3*SG&NI+0$!!A;'O
MBE&QG+* P0I0B3")8[(2GXGR<B$:ZJX$D([EMAIL PROTECTED]"8&ECP/^&R#K)V_VG
MRR!]OW[/?]^ [X'_T3__A!^%+X8_CV^(7XEOBG^+C_^,GXVOCK_5ZL0]HER1
M7Y)O_Y-_E(^5GYP_G5^8SYG?FN__F_^=#YX?GR^@/Z1/I5^F;__6&C_0!^"V
M<1C JZ+7P EPSP> !M!OA-HQ:6= 4:F7\]>Q"0!O:[EMAIL PROTECTED] 8T0$`_BV^=76G
MUF780MG U\ ]\YD9D6%DNL ",&%G&6+[V6$/L'*Q-+&L<=,^8;($?_43&8*]
MX'>BM9/6"]PC:/[EMAIL PROTECTED]&,"Q,3L2N'[EMAIL PROTECTED]/!;:%A;+$]\KPQ#R
9D/_,
M('@3V$ :UJ??&S7>SZ)Z_G#'E348S_0'R.?RD(D(>_^N!,B:[EMAIL PROTECTED]>
MG4GPE35(=KO =#\!('X.OZ-<*\OS061DY0!F2?#_S>0/F<P"Y0$Y$.#P$UW/
M]3]AP<[EMAIL PROTECTED] X8JU!Z92)?^<!M7T.MDD]F_Q,A:D<(>[EMAIL PROTECTED]<B:S.#/
M$,S/]<@`&#HH,-2_7T'_/! _PG/B! \:+QLU$+W4SQ'(D5!21<B03D1)_%1)
M)- =T.$0-1 8.J=/GR#*R_,:S!+\(U\H*,B:Q"HI.M([EMAIL PROTECTED]:/)Y\:
MVQ3-*E\D;[EMAIL PROTECTED]([EMAIL
PROTECTED]@K;RQ_9BTM_P^8Y"(E;TH87DR\$-OPOM'K-6]S
M([EMAIL PROTECTED]< '1`;#YK !R=>40US!#T'JP76%>(3FH6_9;^\^A<.4A9?([EMAIL
PROTECTED]
M/@M/Q(G("[EMAIL PROTECTED] %(>(!P#-\-[\1Y/"A2SL 3(:T5"$!.5;Y,Z7H0NT=R
M$9]'L6]MX)[EMAIL PROTECTED]/4>K2J]2)DO7_BH/>LWT3EP3?DNY++!/'_]2#A5?$EBN
M`'&[EMAIL PROTECTED]/#V<[EMAIL PROTECTED]'_/+!;[P7^07!.:[EMAIL PROTECTED];+_5<
M,4^_<&[EMAIL PROTECTED]")J_</^ZP#M01AA'L5FD&0] 3T%8_R$?6\8;C$=^(T]9E.$1
M1^?[-ZQHU"%([EMAIL PROTECTED]/8Y]DKV6R29__9[]J>&N?;*P4
MQVX/;Q]P+]]Q.4>Q<>]EP4OK<&<OZ_C__]'"@ $A^C/V`#T0`>:N8?W#4&>\
[EMAIL PROTECTED],[EMAIL PROTECTED];Z#\=5]V;_]W?XBO:+A^B ^863MY+WH_
M?W#N3D)\?WV)4.%_/UDU*O^0;Y%_DH]QDT_7E"^5/#$__Y;/E]^8CYF?>\^<
M'U)[EMAIL PROTECTED]&OFF^C;Z1_G8^F/_^G3ZA?J6\O3V5)5J6MGVJ(?R6!A8_0
M"5DTC.\.?GYA0_]6LN$1;156K(<2NM.'[XN_][V_X1%'H2FZQ*]OL'^QC_^R
M[UPQQ&]]BUT/7ARTG^0B_5ZB+HH?S_K*R+T_B/^*#[^+'[Z_C3]HY<K(CU\J
M/'-SP4\$MV-F.( [EMAIL PROTECTED]:P([EMAIL PROTECTED]/W
M`=JN:4Y415)&X$%#15=!)* [EMAIL PROTECTED]>#%<=?P0_$#N,%"P.J\]T-CARP#9,4#\
MLV8"<-/H``4`92['@&W7\MTA&]@@7P96$K ($38T+1 R,2TSX6 P-CB#[&3<
MYFAT=' Z_] ^=^,0Y-#>G]^E!3I-8?IK_.)O-%#;NS*0`K#^H$_N0/C #,7L
M82)0`9!G_5"0;?X&V[<?4ND$PJ'U<1/Z\?BB(ES=`69S,5(W!35F,NN2-LPD
M?04$P #M8 ````,`$! ``````P`1$ `````#`( 0_____T `!S!P88?76I^_
M`4 `"#!P88?76I^_`0L``( (( 8``````, ```````!&``````.%````````
M`P`"@ @@[EMAIL PROTECTED] ```````$8`````$(4````````#``6 "" &``````#
[EMAIL PROTECTED],`"8 (( 8``````, ```````!&``````&%
M````````'@`2@ @@[EMAIL PROTECTED] ```````$8`````5(4```$````$````."XP
M``L`%H (( 8``````, ```````!&``````Z%`````````P`7@ @@[EMAIL PROTECTED]
MP ```````$8`````$84````````#`!F "" &``````# [EMAIL PROTECTED]
MA0```````!X`*( (( 8``````, ```````!&`````#:%```!`````0``````
M```>`"F "" &``````# [EMAIL PROTECTED]'@`J
M@ @@[EMAIL PROTECTED] ```````$8`````.(4```$````!`````````!X`/0`!````
2`0`````````#``TT_3<``,[:
`
end