/*=========================================================================
                                                                                
  Program:   gdcm
  Module:    $RCSfile: gdcmDicomEntry.h,v $
  Language:  C++
  Date:      $Date: 2007/05/23 14:18:09 $
  Version:   $Revision: 1.12 $
                                                                                
  Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
  l'Image). All rights reserved. See Doc/License.txt or
  http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
                                                                                
     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notices for more information.
                                                                                
=========================================================================*/

#ifndef GDCMDICOMENTRY_H
#define GDCMDICOMENTRY_H

#include "gdcmCommon.h"
#include "gdcmRefCounter.h"
#include "gdcmVRKey.h"
#include "gdcmTagKey.h"

namespace GDCM_NAME_SPACE
{
//-----------------------------------------------------------------------------
/**
 * \brief
 * a DicomEntry is an element contained by the Dict.
 * It contains :
 *  - the key referenced by the DICOM norm or the manufacturer(for private keys)
 *    i.e. 
 *    - - the Group number
 *    - - the Element number
 *  - the VR (Value Representation)
 *  - the VM (Value Multiplicity)
 *  - the corresponding name in english
 */
class GDCM_EXPORT DicomEntry : public RefCounter
{
   gdcmTypeMacro(DicomEntry);

public:
// Print
   void Print(std::ostream &os = std::cout, std::string const &indent = "");

   /// \brief  Returns the Dicom Group Number
   /// @return the Dicom Group Number
   const uint16_t &GetGroup() const { return Tag[0]; }

   /// \brief  Returns the Dicom Element Number
   /// @return the Dicom Element Number
   const uint16_t &GetElement() const { return Tag[1]; }

   /// \brief  Returns the Dicom Tag Key
   /// @return the Dicom Tag Key
   const TagKey &GetKey() const { return Tag; }
   
   /// \brief  Set the Dicom Value Representation 
   /// \param vr the Dicom Value Representation
   virtual void SetVR(VRKey const &vr) { VR = vr; }
   /// \brief  Returns the Dicom Value Representation 
   /// @return the Dicom Value Representation
   const VRKey &GetVR() const { return VR; }
   /// \brief tells if the V(alue) R(epresentation) is known (?!)
   /// @return 
   bool IsVRUnknown() const { return VR == GDCM_VRUNKNOWN; }

   const TagKey &GetKey() const { return Tag; }

// Key creation
   static TagKey TranslateToKey(uint16_t group, uint16_t elem)
                                { return TagKey(group,elem); }

protected:
   DicomEntry(const uint16_t &group,const uint16_t &elt,
              const VRKey &vr = GDCM_VRUNKNOWN);
   ~DicomEntry();

private:
   /// Dicom \ref TagKey. Contains Dicom Group number and Dicom Element number
   TagKey Tag;

   /// \brief Value Representation i.e. some clue about the nature
   ///        of the data represented e.g. 
   ///        - "FD" short for "Floating Point Double"(see \ref VR)
   ///        - "PN" short for "Person Name"       
   VRKey VR;
};
} // end namespace gdcm
//-----------------------------------------------------------------------------
#endif
