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
00026
00027
00028
00029
00030 #ifndef OFCOND_H
00031 #define OFCOND_H
00032
00033 #include "dcmtk/config/osconfig.h"
00034 #include "dcmtk/ofstd/oftypes.h"
00035 #include "dcmtk/ofstd/ofstring.h"
00036 #include "dcmtk/ofstd/ofcast.h"
00037
00038 #define INCLUDE_CASSERT
00039 #include "dcmtk/ofstd/ofstdinc.h"
00040
00043 enum OFStatus
00044 {
00046 OF_ok,
00047
00049 OF_error,
00050
00052 OF_failure
00053 };
00054
00055
00058 class OFConditionBase
00059 {
00060 public:
00061
00063 OFConditionBase()
00064 {
00065 }
00066
00068 OFConditionBase(const OFConditionBase& )
00069 {
00070 }
00071
00073 virtual ~OFConditionBase()
00074 {
00075 }
00076
00082 virtual const OFConditionBase *clone() const = 0;
00083
00087 virtual unsigned long codeAndModule() const = 0;
00088
00090 virtual OFStatus status() const = 0;
00091
00093 virtual const char *text() const = 0;
00094
00099 virtual OFBool deletable() const = 0;
00100
00102 unsigned short module() const
00103 {
00104 return OFstatic_cast(unsigned short,((codeAndModule() >> 16) & 0xFFFF));
00105 }
00106
00108 unsigned short code() const
00109 {
00110 return OFstatic_cast(unsigned short,(codeAndModule() & 0xFFFF));
00111 }
00112
00118 OFBool operator==(const OFConditionBase& arg) const
00119 {
00120 return ((status() == arg.status()) && (codeAndModule() == arg.codeAndModule()));
00121 }
00122
00128 OFBool operator!=(const OFConditionBase& arg) const
00129 {
00130 return ((status() != arg.status()) || (code() != arg.code()) || (module() != arg.module()));
00131 }
00132
00133 private:
00134
00136 OFConditionBase& operator=(const OFConditionBase& arg);
00137
00138 };
00139
00140
00141
00146 class OFConditionConst: public OFConditionBase
00147 {
00148 public:
00149
00158 OFConditionConst(unsigned short aModule, unsigned short aCode, OFStatus aStatus, const char *aText)
00159 : OFConditionBase()
00160 , theCodeAndModule(OFstatic_cast(unsigned long, aCode) | OFstatic_cast(unsigned long, aModule << 16))
00161 , theStatus(aStatus)
00162 , theText(aText)
00163 {
00164 }
00165
00167 OFConditionConst(const OFConditionConst& arg)
00168 : OFConditionBase(arg)
00169 , theCodeAndModule(arg.theCodeAndModule)
00170 , theStatus(arg.theStatus)
00171 , theText(arg.theText)
00172 {
00173 }
00174
00176 virtual ~OFConditionConst()
00177 {
00178 }
00179
00184 virtual const OFConditionBase *clone() const;
00185
00189 virtual unsigned long codeAndModule() const;
00190
00192 virtual OFStatus status() const;
00193
00195 virtual const char *text() const;
00196
00201 virtual OFBool deletable() const;
00202
00203 private:
00204
00206 OFConditionConst& operator=(const OFConditionConst& arg);
00207
00209 unsigned long theCodeAndModule;
00210
00212 OFStatus theStatus;
00213
00215 const char *theText;
00216
00217 };
00218
00219
00220
00224 class OFConditionString: public OFConditionBase
00225 {
00226 public:
00227
00235 OFConditionString(unsigned short aModule, unsigned short aCode, OFStatus aStatus, const char *aText)
00236 : OFConditionBase()
00237 , theCodeAndModule(OFstatic_cast(unsigned long, aCode) | OFstatic_cast(unsigned long, aModule << 16))
00238 , theStatus(aStatus)
00239 , theText()
00240 {
00241 if (aText) theText = aText;
00242 }
00243
00245 OFConditionString(const OFConditionString& arg)
00246 : OFConditionBase(arg)
00247 , theCodeAndModule(arg.theCodeAndModule)
00248 , theStatus(arg.theStatus)
00249 , theText(arg.theText)
00250 {
00251 }
00252
00254 virtual ~OFConditionString()
00255 {
00256 }
00257
00262 virtual const OFConditionBase *clone() const;
00263
00267 virtual unsigned long codeAndModule() const;
00268
00270 virtual OFStatus status() const;
00271
00273 virtual const char *text() const;
00274
00279 virtual OFBool deletable() const;
00280
00281 private:
00283 OFConditionString& operator=(const OFConditionString& arg);
00284
00286 unsigned long theCodeAndModule;
00287
00289 OFStatus theStatus;
00290
00292 OFString theText;
00293 };
00294
00295
00296
00297 extern const OFConditionConst ECC_Normal;
00298
00299
00305 class OFCondition
00306 {
00307 public:
00308
00314 OFCondition(OFConditionString *base)
00315 : theCondition(base)
00316 {
00317 assert(theCondition);
00318 }
00319
00325 #ifdef OFCONDITION_STRICT_MODE
00326
00327 OFCondition(const OFConditionConst& base)
00328 #else
00329 OFCondition(const OFConditionConst& base = ECC_Normal)
00330 #endif
00331 : theCondition(&base)
00332 {
00333 assert(theCondition);
00334 }
00335
00337 OFCondition(const OFCondition& arg)
00338 : theCondition(arg.theCondition->clone())
00339 {
00340 assert(theCondition);
00341 }
00342
00344 ~OFCondition()
00345 {
00346 if (theCondition->deletable())
00347 {
00348 delete OFconst_cast(OFConditionBase *, theCondition);
00349 }
00350 }
00351
00353 OFCondition& operator=(const OFCondition& arg)
00354 {
00355 if (&arg != this)
00356 {
00357 if (theCondition->deletable())
00358 {
00359 delete OFconst_cast(OFConditionBase *, theCondition);
00360 }
00361 theCondition = arg.theCondition->clone();
00362 assert(theCondition);
00363 }
00364 return *this;
00365 }
00366
00368 inline unsigned short module() const
00369 {
00370 return theCondition->module();
00371 }
00372
00374 inline unsigned short code() const
00375 {
00376 return theCondition->code();
00377 }
00378
00380 inline OFStatus status() const
00381 {
00382 return theCondition->status();
00383 }
00384
00386 inline const char *text() const
00387 {
00388 return theCondition->text();
00389 }
00390
00392 inline OFBool good() const
00393 {
00394 OFStatus s = theCondition->status();
00395 return (s == OF_ok);
00396 }
00397
00399 inline OFBool bad() const
00400 {
00401 OFStatus s = theCondition->status();
00402 return (s != OF_ok);
00403 }
00404
00405 #ifdef OFCONDITION_IMPLICIT_BOOL_CONVERSION
00406
00407
00408
00409
00410
00414 inline operator OFBool() const
00415 {
00416 return good();
00417 }
00418 #endif
00419
00425 inline OFBool operator==(const OFCondition& arg) const
00426 {
00427 return (*theCondition == *arg.theCondition);
00428 }
00429
00435 inline OFBool operator!=(const OFCondition& arg) const
00436 {
00437 return (*theCondition != *arg.theCondition);
00438 }
00439
00440 private:
00441
00443 const OFConditionBase *theCondition;
00444
00445 };
00446
00447
00448
00449
00450
00451
00452
00454 extern const OFCondition EC_Normal;
00455
00457 extern const OFCondition EC_IllegalParameter;
00458
00460 extern const OFCondition EC_MemoryExhausted;
00461
00462
00465 #define makeOFCondition(A, B, C, D) OFCondition(new OFConditionString((A), (B), (C), (D)))
00466
00467
00468 #endif
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510