401 lines
12 KiB
C
401 lines
12 KiB
C
|
/*
|
||
|
*
|
||
|
* Copyright (C) 1994-2011, OFFIS e.V.
|
||
|
* All rights reserved. See COPYRIGHT file for details.
|
||
|
*
|
||
|
* This software and supporting documentation were developed by
|
||
|
*
|
||
|
* OFFIS e.V.
|
||
|
* R&D Division Health
|
||
|
* Escherweg 2
|
||
|
* D-26121 Oldenburg, Germany
|
||
|
*
|
||
|
*
|
||
|
* Module: dcmdata
|
||
|
*
|
||
|
* Author: Andrew Hewett
|
||
|
*
|
||
|
* Purpose: Interface for a dictionary entry in the loadable DICOM data dictionary
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef DCDICENT_H
|
||
|
#define DCDICENT_H
|
||
|
|
||
|
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
|
||
|
#include "dcmtk/dcmdata/dctagkey.h"
|
||
|
#include "dcmtk/dcmdata/dcvr.h"
|
||
|
|
||
|
#define INCLUDE_CSTRING /* for strcmp() */
|
||
|
#include "dcmtk/ofstd/ofstdinc.h"
|
||
|
|
||
|
/// constant describing an unlimited VM
|
||
|
#define DcmVariableVM -1
|
||
|
|
||
|
#define DCM_INRANGE(x,a,b) (((x) >= (a)) && ((x) <= (b)))
|
||
|
#define DCM_IS_ODD(x) (((x) % 2) == 1)
|
||
|
#define DCM_IS_EVEN(x) (((x) % 2) == 0)
|
||
|
|
||
|
|
||
|
/** attribute tag group/element range restrictions
|
||
|
*/
|
||
|
enum DcmDictRangeRestriction
|
||
|
{
|
||
|
/// integer range
|
||
|
DcmDictRange_Unspecified,
|
||
|
|
||
|
/// odd range
|
||
|
DcmDictRange_Odd,
|
||
|
|
||
|
/// even range
|
||
|
DcmDictRange_Even
|
||
|
};
|
||
|
|
||
|
|
||
|
/** each object of this class manages one entry of the
|
||
|
* global DICOM data dictionary.
|
||
|
*/
|
||
|
class DCMTK_DCMDATA_EXPORT DcmDictEntry: public DcmTagKey
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
/** constructor
|
||
|
* @param g attribute tag group
|
||
|
* @param e attribute tag element
|
||
|
* @param vr value representation
|
||
|
* @param nam attribute name
|
||
|
* @param vmMin lower limit for value multiplicity
|
||
|
* @param vmMax upper limit for value multiplicity, DcmVariableVM for unlimited
|
||
|
* @param vers standard version name, may be NULL
|
||
|
* @param doCopyStrings true if strings should be copied, false if only referenced
|
||
|
* @param pcreator private creator name, may be NULL (for standard tags)
|
||
|
*/
|
||
|
DcmDictEntry(Uint16 g, Uint16 e, DcmVR vr,
|
||
|
const char* nam, int vmMin, int vmMax,
|
||
|
const char* vers, OFBool doCopyStrings,
|
||
|
const char* pcreator);
|
||
|
|
||
|
/** constructor for repeating tags
|
||
|
* @param g attribute tag group lower limit
|
||
|
* @param e attribute tag element lower limit
|
||
|
* @param ug attribute tag group upper limit
|
||
|
* @param ue attribute tag element upper limit
|
||
|
* @param vr value representation
|
||
|
* @param nam attribute name
|
||
|
* @param vmMin lower limit for value multiplicity
|
||
|
* @param vmMax upper limit for value multiplicity, DcmVariableVM for unlimited
|
||
|
* @param vers standard version name, may be NULL
|
||
|
* @param doCopyStrings true if strings should be copied, false if only referenced
|
||
|
* @param pcreator private creator name, may be NULL (for standard tags)
|
||
|
*/
|
||
|
DcmDictEntry(Uint16 g, Uint16 e, Uint16 ug, Uint16 ue, DcmVR vr,
|
||
|
const char* nam, int vmMin, int vmMax,
|
||
|
const char* vers, OFBool doCopyStrings,
|
||
|
const char* pcreator);
|
||
|
|
||
|
/// copy constructor
|
||
|
DcmDictEntry(const DcmDictEntry& e);
|
||
|
|
||
|
/// destructor
|
||
|
~DcmDictEntry();
|
||
|
|
||
|
/* access methods */
|
||
|
|
||
|
/// returns VR object by value
|
||
|
DcmVR getVR() const
|
||
|
{
|
||
|
return valueRepresentation;
|
||
|
}
|
||
|
|
||
|
/// returns VR code
|
||
|
DcmEVR getEVR() const
|
||
|
{
|
||
|
return valueRepresentation.getEVR();
|
||
|
}
|
||
|
|
||
|
/// returns standard version string, may be NULL
|
||
|
const char* getStandardVersion() const
|
||
|
{
|
||
|
return standardVersion;
|
||
|
}
|
||
|
|
||
|
/// returns tag name
|
||
|
const char* getTagName() const
|
||
|
{
|
||
|
return tagName;
|
||
|
}
|
||
|
|
||
|
/// returns private creator code, may be NULL
|
||
|
const char* getPrivateCreator() const
|
||
|
{
|
||
|
return privateCreator;
|
||
|
}
|
||
|
|
||
|
/** checks if the private creator code equals the given string
|
||
|
* @param c string to compare with, may be NULL
|
||
|
* @return true if equal, false otherwise
|
||
|
*/
|
||
|
int privateCreatorMatch(const char *c) const
|
||
|
{
|
||
|
return
|
||
|
(
|
||
|
((privateCreator == NULL) && (c == NULL)) ||
|
||
|
(privateCreator && c && (0 == strcmp(privateCreator, c)))
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/** checks if the private creator code of this object matches
|
||
|
* the one of the given object.
|
||
|
* @param arg dictionary entry to compare with
|
||
|
* @return true if private creators are equal, false otherwise
|
||
|
*/
|
||
|
int privateCreatorMatch(const DcmDictEntry& arg) const
|
||
|
{
|
||
|
return privateCreatorMatch(arg.privateCreator);
|
||
|
}
|
||
|
|
||
|
/// returns lower limit for VM (value multiplicity)
|
||
|
int getVMMin() const
|
||
|
{
|
||
|
return valueMultiplicityMin;
|
||
|
}
|
||
|
|
||
|
/// returns upper limit for VM (value multiplicity), DcmVariableVM for unlimited
|
||
|
int getVMMax() const
|
||
|
{
|
||
|
return valueMultiplicityMax;
|
||
|
}
|
||
|
|
||
|
/// returns true if element has a single valid VM value
|
||
|
OFBool isFixedSingleVM() const
|
||
|
{
|
||
|
return ((valueMultiplicityMin != DcmVariableVM) &&
|
||
|
(valueMultiplicityMin == valueMultiplicityMax));
|
||
|
}
|
||
|
|
||
|
/// returns true if element has a fixed VM range
|
||
|
OFBool isFixedRangeVM() const
|
||
|
{
|
||
|
return ((valueMultiplicityMin != DcmVariableVM) &&
|
||
|
(valueMultiplicityMax != DcmVariableVM));
|
||
|
}
|
||
|
|
||
|
/// returns true if element has a variable VM range (no upper limit)
|
||
|
OFBool isVariableRangeVM() const
|
||
|
{
|
||
|
return ((valueMultiplicityMin != DcmVariableVM) &&
|
||
|
(valueMultiplicityMax == DcmVariableVM));
|
||
|
}
|
||
|
|
||
|
/** converts entry into repeating tag entry by defining an upper limit
|
||
|
* for group and element, taken from the given tag key.
|
||
|
* @param key tag key containing upper limit for group and element
|
||
|
*/
|
||
|
void setUpper(const DcmTagKey& key)
|
||
|
{
|
||
|
upperKey = key;
|
||
|
}
|
||
|
|
||
|
/** converts entry into repeating tag entry by defining an upper limit
|
||
|
* for tag group
|
||
|
* @param ug upper limit for tag group
|
||
|
*/
|
||
|
void setUpperGroup(Uint16 ug)
|
||
|
{
|
||
|
upperKey.setGroup(ug);
|
||
|
}
|
||
|
|
||
|
/** converts entry into repeating tag entry by defining an upper limit
|
||
|
* for tag element
|
||
|
* @param ue upper limit for tag element
|
||
|
*/
|
||
|
void setUpperElement(Uint16 ue)
|
||
|
{
|
||
|
upperKey.setElement(ue);
|
||
|
}
|
||
|
|
||
|
/// returns upper limit for tag group
|
||
|
Uint16 getUpperGroup() const
|
||
|
{
|
||
|
return upperKey.getGroup();
|
||
|
}
|
||
|
|
||
|
/// returns upper limit for tag element
|
||
|
Uint16 getUpperElement() const
|
||
|
{
|
||
|
return upperKey.getElement();
|
||
|
}
|
||
|
|
||
|
/// returns attribute tag as DcmTagKey object by value
|
||
|
DcmTagKey getKey() const
|
||
|
{
|
||
|
return * OFstatic_cast(const DcmTagKey *, this);
|
||
|
}
|
||
|
|
||
|
/// returns upper limits for attribute tag as DcmTagKey object by value
|
||
|
DcmTagKey getUpperKey() const
|
||
|
{
|
||
|
return upperKey;
|
||
|
}
|
||
|
|
||
|
/// returns true if entry is has a repeating group
|
||
|
int isRepeatingGroup() const
|
||
|
{
|
||
|
return (getGroup() != getUpperGroup());
|
||
|
}
|
||
|
|
||
|
/// returns true if entry is has a repeating element
|
||
|
int isRepeatingElement() const
|
||
|
{
|
||
|
return (getElement() != getUpperElement());
|
||
|
}
|
||
|
|
||
|
/// returns true if entry is repeating (group or element)
|
||
|
int isRepeating() const
|
||
|
{
|
||
|
return (isRepeatingGroup() || isRepeatingElement());
|
||
|
}
|
||
|
|
||
|
/// returns group range restriction
|
||
|
DcmDictRangeRestriction getGroupRangeRestriction() const
|
||
|
{
|
||
|
return groupRangeRestriction;
|
||
|
}
|
||
|
|
||
|
/// sets group range restriction
|
||
|
void setGroupRangeRestriction(DcmDictRangeRestriction rr)
|
||
|
{
|
||
|
groupRangeRestriction = rr;
|
||
|
}
|
||
|
|
||
|
/// returns element range restriction
|
||
|
DcmDictRangeRestriction getElementRangeRestriction() const
|
||
|
{
|
||
|
return elementRangeRestriction;
|
||
|
}
|
||
|
|
||
|
/// sets element range restriction
|
||
|
void setElementRangeRestriction(DcmDictRangeRestriction rr)
|
||
|
{
|
||
|
elementRangeRestriction = rr;
|
||
|
}
|
||
|
|
||
|
/* containment */
|
||
|
|
||
|
/** checks if the given tag key and private creator code are covered
|
||
|
* by this object.
|
||
|
* @param key tag key
|
||
|
* @param privCreator private creator, may be NULL
|
||
|
* @return true if this entry contains the given tag for the given private creator
|
||
|
*/
|
||
|
int contains(const DcmTagKey& key, const char *privCreator) const /* this contains key */
|
||
|
{
|
||
|
if ((getGroupRangeRestriction() == DcmDictRange_Even) &&
|
||
|
DCM_IS_ODD(key.getGroup()))
|
||
|
return OFFalse;
|
||
|
else if ((getGroupRangeRestriction() == DcmDictRange_Odd) &&
|
||
|
DCM_IS_EVEN(key.getGroup()))
|
||
|
return OFFalse;
|
||
|
else if ((getElementRangeRestriction() == DcmDictRange_Even) &&
|
||
|
DCM_IS_ODD(key.getElement()))
|
||
|
return OFFalse;
|
||
|
else if ((getElementRangeRestriction() == DcmDictRange_Odd) &&
|
||
|
DCM_IS_EVEN(key.getElement()))
|
||
|
return OFFalse;
|
||
|
else if (! privateCreatorMatch(privCreator))
|
||
|
return OFFalse;
|
||
|
else
|
||
|
{
|
||
|
const OFBool groupMatches=DCM_INRANGE(key.getGroup(), getGroup(), getUpperGroup());
|
||
|
OFBool found=groupMatches && DCM_INRANGE(key.getElement(), getElement(), getUpperElement());
|
||
|
if (!found && groupMatches && privCreator)
|
||
|
found=DCM_INRANGE(key.getElement() & 0xFF, getElement(), getUpperElement());
|
||
|
return found;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/** checks if this entry contains the given name
|
||
|
* @param name attribute name, must not be NULL
|
||
|
* @return true if tagName matches the given string
|
||
|
*/
|
||
|
int contains(const char *name) const /* this contains named key */
|
||
|
{
|
||
|
return !strcmp( tagName, name );
|
||
|
}
|
||
|
|
||
|
/* set relations */
|
||
|
|
||
|
/** checks if this entry describes a true subset of tag range
|
||
|
* described by the given entry.
|
||
|
* @param e entry to compare with
|
||
|
* @return true if this object is subset of e
|
||
|
*/
|
||
|
int subset(const DcmDictEntry& e) const /* this is a subset of key */
|
||
|
{
|
||
|
return ( (getGroup() >= e.getGroup()) &&
|
||
|
(getUpperGroup() <= e.getUpperGroup()) &&
|
||
|
(getElement() >= e.getElement()) &&
|
||
|
(getUpperElement() <= e.getUpperElement()) &&
|
||
|
privateCreatorMatch(e.privateCreator)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/** checks if this entry describes the same tag range as the given entry.
|
||
|
* @param e entry to compare with
|
||
|
* @return true if objects describe the same tag range
|
||
|
*/
|
||
|
int setEQ(const DcmDictEntry& e) const /* this is set equal to key */
|
||
|
{
|
||
|
return ( (getGroup() == e.getGroup()) &&
|
||
|
(getUpperGroup() == e.getUpperGroup()) &&
|
||
|
(getElement() == e.getElement()) &&
|
||
|
(getUpperElement() == e.getUpperElement()) &&
|
||
|
(getGroupRangeRestriction() == e.getGroupRangeRestriction()) &&
|
||
|
(getElementRangeRestriction() == e.getElementRangeRestriction()) &&
|
||
|
privateCreatorMatch(e.privateCreator)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/// friend operator<<
|
||
|
friend DCMTK_DCMDATA_EXPORT STD_NAMESPACE ostream& operator<<(STD_NAMESPACE ostream& s, const DcmDictEntry& e);
|
||
|
|
||
|
private:
|
||
|
|
||
|
/// private undefined copy assignment operator
|
||
|
DcmDictEntry &operator=(const DcmDictEntry &);
|
||
|
|
||
|
/** upper limit of repeating group and element (lower limit is inherited
|
||
|
* from DcmTagKey)
|
||
|
*/
|
||
|
DcmTagKey upperKey;
|
||
|
|
||
|
/// value representation
|
||
|
DcmVR valueRepresentation;
|
||
|
|
||
|
/// attribute name
|
||
|
const char *tagName;
|
||
|
|
||
|
/// lower limit for VM
|
||
|
int valueMultiplicityMin;
|
||
|
|
||
|
/// upper limit for VM
|
||
|
int valueMultiplicityMax;
|
||
|
|
||
|
/// standard version name, may be NULL
|
||
|
const char *standardVersion;
|
||
|
|
||
|
/// true if strings are copies (i.e. should be deleted upon destruction)
|
||
|
OFBool stringsAreCopies;
|
||
|
|
||
|
/// restriction (even, odd, unrestricted) for group range
|
||
|
DcmDictRangeRestriction groupRangeRestriction;
|
||
|
|
||
|
/// restriction (even, odd, unrestricted) for element range
|
||
|
DcmDictRangeRestriction elementRangeRestriction;
|
||
|
|
||
|
/// private creator name, may be NULL
|
||
|
const char *privateCreator;
|
||
|
};
|
||
|
|
||
|
#endif /* !DCDICENT_H */
|