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
00031
00032
00033
00034 #ifndef OFCOND_H
00035 #define OFCOND_H
00036
00037 #include "dcmtk/config/osconfig.h"
00038 #include "dcmtk/ofstd/oftypes.h"
00039 #include "dcmtk/ofstd/ofstring.h"
00040 #include "dcmtk/ofstd/ofcast.h"
00041
00042 #define INCLUDE_CASSERT
00043 #include "dcmtk/ofstd/ofstdinc.h"
00044
00047 enum OFStatus
00048 {
00050 OF_ok,
00051
00053 OF_error,
00054
00056 OF_failure
00057 };
00058
00059
00062 class OFConditionBase
00063 {
00064 public:
00065
00067 OFConditionBase()
00068 {
00069 }
00070
00072 OFConditionBase(const OFConditionBase& )
00073 {
00074 }
00075
00077 virtual ~OFConditionBase()
00078 {
00079 }
00080
00086 virtual const OFConditionBase *clone() const = 0;
00087
00091 virtual unsigned long codeAndModule() const = 0;
00092
00094 virtual OFStatus status() const = 0;
00095
00097 virtual const char *text() const = 0;
00098
00103 virtual OFBool deletable() const = 0;
00104
00106 unsigned short module() const
00107 {
00108 return OFstatic_cast(unsigned short,((codeAndModule() >> 16) & 0xFFFF));
00109 }
00110
00112 unsigned short code() const
00113 {
00114 return OFstatic_cast(unsigned short,(codeAndModule() & 0xFFFF));
00115 }
00116
00122 OFBool operator==(const OFConditionBase& arg) const
00123 {
00124 return ((status() == arg.status()) && (codeAndModule() == arg.codeAndModule()));
00125 }
00126
00132 OFBool operator!=(const OFConditionBase& arg) const
00133 {
00134 return ((status() != arg.status()) || (code() != arg.code()) || (module() != arg.module()));
00135 }
00136
00137 private:
00138
00140 OFConditionBase& operator=(const OFConditionBase& arg);
00141
00142 };
00143
00144
00145
00150 class OFConditionConst: public OFConditionBase
00151 {
00152 public:
00153
00162 OFConditionConst(unsigned short aModule, unsigned short aCode, OFStatus aStatus, const char *aText)
00163 : OFConditionBase()
00164 , theCodeAndModule(OFstatic_cast(unsigned long, aCode) | OFstatic_cast(unsigned long, aModule << 16))
00165 , theStatus(aStatus)
00166 , theText(aText)
00167 {
00168 }
00169
00171 OFConditionConst(const OFConditionConst& arg)
00172 : OFConditionBase(arg)
00173 , theCodeAndModule(arg.theCodeAndModule)
00174 , theStatus(arg.theStatus)
00175 , theText(arg.theText)
00176 {
00177 }
00178
00180 virtual ~OFConditionConst()
00181 {
00182 }
00183
00188 virtual const OFConditionBase *clone() const;
00189
00193 virtual unsigned long codeAndModule() const;
00194
00196 virtual OFStatus status() const;
00197
00199 virtual const char *text() const;
00200
00205 virtual OFBool deletable() const;
00206
00207 private:
00208
00210 OFConditionConst& operator=(const OFConditionConst& arg);
00211
00213 unsigned long theCodeAndModule;
00214
00216 OFStatus theStatus;
00217
00219 const char *theText;
00220
00221 };
00222
00223
00224
00228 class OFConditionString: public OFConditionBase
00229 {
00230 public:
00231
00239 OFConditionString(unsigned short aModule, unsigned short aCode, OFStatus aStatus, const char *aText)
00240 : OFConditionBase()
00241 , theCodeAndModule(OFstatic_cast(unsigned long, aCode) | OFstatic_cast(unsigned long, aModule << 16))
00242 , theStatus(aStatus)
00243 , theText()
00244 {
00245 if (aText) theText = aText;
00246 }
00247
00249 OFConditionString(const OFConditionString& arg)
00250 : OFConditionBase(arg)
00251 , theCodeAndModule(arg.theCodeAndModule)
00252 , theStatus(arg.theStatus)
00253 , theText(arg.theText)
00254 {
00255 }
00256
00258 virtual ~OFConditionString()
00259 {
00260 }
00261
00266 virtual const OFConditionBase *clone() const;
00267
00271 virtual unsigned long codeAndModule() const;
00272
00274 virtual OFStatus status() const;
00275
00277 virtual const char *text() const;
00278
00283 virtual OFBool deletable() const;
00284
00285 private:
00287 OFConditionString& operator=(const OFConditionString& arg);
00288
00290 unsigned long theCodeAndModule;
00291
00293 OFStatus theStatus;
00294
00296 OFString theText;
00297 };
00298
00299
00300
00301 extern const OFConditionConst ECC_Normal;
00302
00303
00309 class OFCondition
00310 {
00311 public:
00312
00318 OFCondition(OFConditionString *base)
00319 : theCondition(base)
00320 {
00321 assert(theCondition);
00322 }
00323
00329 #ifdef OFCONDITION_STRICT_MODE
00330
00331 OFCondition(const OFConditionConst& base)
00332 #else
00333 OFCondition(const OFConditionConst& base = ECC_Normal)
00334 #endif
00335 : theCondition(&base)
00336 {
00337 assert(theCondition);
00338 }
00339
00341 OFCondition(const OFCondition& arg)
00342 : theCondition(arg.theCondition->clone())
00343 {
00344 assert(theCondition);
00345 }
00346
00348 ~OFCondition()
00349 {
00350 if (theCondition->deletable())
00351 {
00352 delete OFconst_cast(OFConditionBase *, theCondition);
00353 }
00354 }
00355
00357 OFCondition& operator=(const OFCondition& arg)
00358 {
00359 if (&arg != this)
00360 {
00361 if (theCondition->deletable())
00362 {
00363 delete OFconst_cast(OFConditionBase *, theCondition);
00364 }
00365 theCondition = arg.theCondition->clone();
00366 assert(theCondition);
00367 }
00368 return *this;
00369 }
00370
00372 inline unsigned short module() const
00373 {
00374 return theCondition->module();
00375 }
00376
00378 inline unsigned short code() const
00379 {
00380 return theCondition->code();
00381 }
00382
00384 inline OFStatus status() const
00385 {
00386 return theCondition->status();
00387 }
00388
00390 inline const char *text() const
00391 {
00392 return theCondition->text();
00393 }
00394
00396 inline OFBool good() const
00397 {
00398 OFStatus s = theCondition->status();
00399 return (s == OF_ok);
00400 }
00401
00403 inline OFBool bad() const
00404 {
00405 OFStatus s = theCondition->status();
00406 return (s != OF_ok);
00407 }
00408
00409 #ifdef OFCONDITION_IMPLICIT_BOOL_CONVERSION
00410
00411
00412
00413
00414
00418 inline operator OFBool() const
00419 {
00420 return good();
00421 }
00422 #endif
00423
00429 inline OFBool operator==(const OFCondition& arg) const
00430 {
00431 return (*theCondition == *arg.theCondition);
00432 }
00433
00439 inline OFBool operator!=(const OFCondition& arg) const
00440 {
00441 return (*theCondition != *arg.theCondition);
00442 }
00443
00444 private:
00445
00447 const OFConditionBase *theCondition;
00448
00449 };
00450
00451
00452
00453
00454
00455
00456
00458 extern const OFCondition EC_Normal;
00459
00461 extern const OFCondition EC_IllegalParameter;
00462
00464 extern const OFCondition EC_MemoryExhausted;
00465
00466
00469 #define makeOFCondition(A, B, C, D) OFCondition(new OFConditionString((A), (B), (C), (D)))
00470
00471
00472 #endif
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
00511