/*=========================================================================

  Program:   gdcm
  Module:    $RCSfile: gdcmDefaultDicts.cxx.in,v $
  Language:  C++
  Date:      $Date: 2006/02/18 12:36:38 $
  Version:   $Revision: 1.6 $

  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 GDCMDEFAULTDICTS_H
#define GDCMDEFAULTDICTS_H

#include "gdcmDict.h"
#include "gdcmDictEntry.h"
#include "gdcmTS.h"
#include "gdcmVR.h"
#include "gdcmDictGroupName.h"
#include "gdcmDicomDirElement.h"

namespace gdcm
{

typedef struct
{
   uint16_t group;
   uint16_t element;
   const char *vr;
   const char *vm;
   const char *name;
} DICT_ENTRY;

static DICT_ENTRY datadir[] = {
@DICOM_DATA_DICTIONARY@
};

void FillDefaultDataDict(Dict *d)
{
   unsigned int i = 0;
   DICT_ENTRY n = datadir[i];
   while( n.name != 0 )
   {
      const DictEntry e( n.group, n.element, n.vr, n.vm, n.name);
      d->AddEntry( e );
      n = datadir[++i];
   }
}

void FillDefaultTSDict(TSHT &ts)
{
@DICOM_TS_DICTIONARY@
}

void FillDefaultVRDict(VRHT &vr)
{
@DICOM_VR_DICTIONARY@
}

void FillDefaultDictGroupName(DictGroupNameHT &groupName)
{
@DICT_GROUP_NAME_DICTIONARY@
}

typedef struct
{
   const char *type;
   unsigned short group;
   unsigned short element;
   const char *value;
} ELEMENT;

static ELEMENT dataElement[] = {
@DICOM_DIR_DICTIONARY@
};

void FillDefaultDIRDict(DicomDirElement *dde)
{
   unsigned int i = 0;
   ELEMENT e = dataElement[i];
   Element elem;
   DicomDirType type;
   std::string strType;

   while( e.type != 0 )
   {
      // Force to use the string comparision operator ==
      strType = e.type;
      if( strType == "metaElem" )
         type = DD_META;
      else if( strType == "patientElem" )
         type = DD_PATIENT;
      else if( strType == "studyElem" )
         type = DD_STUDY;
      else if( strType == "serieElem" )
         type = DD_SERIE;
      else if( strType == "imageElem" )
         type = DD_IMAGE;
      else
         type = DD_UNKNOWN;

      elem.Group = e.group;
      elem.Elem  = e.element;
      elem.Value = e.value;
      dde->AddEntry( type, elem);
      e = dataElement[++i];
   }
}

} //end gdcm namespace
#endif

