-const std::string GDCM_UNFOUND = "gdcm::Unfound"; /// MEMORY LEAK
-const std::string GDCM_BINLOADED = "gdcm::Binary data loaded";
-const std::string GDCM_NOTLOADED = "gdcm::NotLoaded";
-const std::string GDCM_UNREAD = "gdcm::UnRead";
-
-/// \brief gdcmTagKey is made to old an "universal" (as in URL, Universal
-/// Ressource Locator) key to a gdcmDocEntry i.e. a dicom tag.
-/// A dicom tag allways has a group and an element, but a set of tags
-/// embeded in various (optionally nested) sequences and sharing
-/// the same group and element all share the same (group, element)
-/// "identifier". Hence the (group, element) cannot be used as an
-/// identifier (in gdcm we shall refer to a "TagKey") of a tag.
-/// In order to construct a proper tag identifier (i.e. a key) we
-/// consider the following definition of a TagKey:
-/// - let Group, Element be the string representation of the
-/// group and element dicom tag members,
-/// - let ItemNumber be the string representation of the integer
-/// index of the considered item number of a sequence,
-/// Let the key of a tag embeded in a sequence, noted SeqTag, be
-/// the form:
-/// /ItemNumber#Group|Element
-/// where "/", "#" and "|" are characters acting as separators.
-/// Then the general form of a gdcmTagKey is given by:
-/// Group|Element[SeqTag]
-/// where [SeqTag] means NO or many instances of SeqTag.
-/// Hence the gdcmTagKey of a tag not "leaving" in a sequence is the
-/// string e.g.
-/// 0028|1201
-/// but the gdcmTagKey of a tag "embeded" is the first item of
-/// a sequence, itself nested in the third item of a sequence is the
-/// string e.g.
-/// 0004|1220/2#0008|0082/0#0008|0090
-typedef std::string gdcmTagKey;
+#if FASTTAGKEY
+typedef union {
+ uint16_t tab[2];
+ uint32_t tagkey;
+ } TagKey;
+/* ostream operator for TagKey */
+inline std::ostream& operator<<(std::ostream& _O, TagKey _val)
+{
+ _O.setf( std::ios::right);
+ return (_O << std::hex << std::setw( 4 ) << std::setfill( '0' )
+ << _val.tab[0] << '|' << std::setw( 4 ) << std::setfill( '0' )
+ << _val.tab[1] << std::setfill( ' ' ) << std::dec);
+};
+inline bool operator==(TagKey _self, TagKey _val)
+{
+ return _self.tagkey == _val.tagkey;
+};
+inline bool operator<(TagKey _self, TagKey _val)
+{
+ // This expression is a tad faster but PrintFile output
+ // is more difficult to read
+ //return _self.tagkey < _val.tagkey;
+
+ // More usal order of dicom tags:
+ if( _self.tab[0] == _val.tab[0] )
+ return _self.tab[1] < _val.tab[1];
+ return _self.tab[0] < _val.tab[0];
+};
+#else
+typedef std::string TagKey;
+#endif
+#if defined(_MSC_VER) && (_MSC_VER == 1200)
+// Doing everything within gdcm namespace to avoid polluting 3d party software
+inline std::ostream& operator<<(std::ostream& _O, std::string _val)
+{
+ return _O << _val.c_str();
+};
+#endif