#ifndef DRS_FIELDMAP_H
#define DRS_FIELDMAP_H

#include <vector>

#include "drs_type.h"

class APPL_DECL DRS_FieldMapEntry
{
  public:
  DRS_FieldMapEntry() : iStateCount(0), States(0)
    {};
  //Constructor: file line + number of states in line
  DRS_FieldMapEntry( byte *instr, uint iStates);

  virtual ~DRS_FieldMapEntry();
    
  //Assignment
  DRS_FieldMapEntry const & operator =( DRS_FieldMapEntry const &rEntry);

  inline byte const * State( uint iState) const {return States[iState];};
  inline uint         StateCount() const {return iStateCount;};
  inline uint         MaxLength() const { return m_iMaxLength;};

  private:
  uint                iStateCount;
  std::vector< byte *> States;
  uint                m_iMaxLength;
};

class APPL_DECL DRS_FieldMap
{
  public:
  DRS_FieldMap( AT_String sFile, AT_String sSection, DRS_Setting BaseKey, byte *sMapFile);
  ~DRS_FieldMap();
  
  inline uint               StateCount() const { return iStateCount;};
  DRS_Descriptor const &    State( uint iState) const;
  inline uint               Size() const { return vEntries.size();};

  //Get entry by FieldMapEntryID: mapped data field retrieval
  DRS_FieldMapEntry const & Entry( uint iEntry) const 
	{ assert(0); return DRS_FieldMapEntry(); }

  //Get entry by order in sorted state: mapped index selection
  DRS_FieldMapEntry const & Entry( uint iEntry, uint iState) const 
	{ assert(0); return DRS_FieldMapEntry(); }

  //Convert sorted state entry to FieldMapEntryID
  uint                      StateEntryToFieldMapEntry( uint iState, uint iEntry) const
	  { assert(0); return 0; }

  //Get Max Entry Length
  uint MaxEntryLength() const { return m_iMaxEntryLength;};
  
  private:
  uint iStateCount;
  auto_array<DRS_DescriptorSerialize>      aaStateDescriptors;
  std::vector< DRS_FieldMapEntry *>        vEntries;
  std::vector<std::vector<uint> >         aaSortedStates;
  uint                                   m_iMaxEntryLength;

  void SortState( uint EntryIndexes[], uint iState);
};

#endif
