// field.h --
// $Id: field.h 403187 2005-04-04 20:17:07Z osterfeld $
// This is part of Metakit, see http://www.equi4.com/metakit/

/** @file
 * Core class to represent fields
 */

#ifndef __FIELD_H__
#define __FIELD_H__

#ifndef __K4CONF_H__
#error Please include "k4conf.h" before this header file
#endif
  
/////////////////////////////////////////////////////////////////////////////

class c4_Field
{
  c4_PtrArray _subFields;
  c4_String _name;
  char _type;
  c4_Field* _indirect;

public: 
/* Construction / destruction */
  c4_Field (const char*&, c4_Field* =0);
    //: Constructs a new field.
  ~c4_Field ();

/* Repeating and compound fields */
  int NumSubFields() const; 
    //: Returns the number of subfields.
  c4_Field& SubField(int) const;
    //: Returns the description of each subfield.
  bool IsRepeating() const;
    //: Returns true if this field contains subtables.
  
/* Field name and description */
  const c4_String& Name() const;
    //: Returns name of this field.
  char Type() const;
    //: Returns the type description of this field, if any.
  char OrigType() const;
    //: Similar, but report types which were originall 'M' as well.
  c4_String Description(bool anonymous_ =false) const;
    //: Describes the structure, omit names if anonymous.
  c4_String DescribeSubFields(bool anonymous_ =false) const;
    //: Describes just the subfields, omit names if anonymous.
  
private:
  c4_Field (const c4_Field&);     // not implemented
  void operator= (const c4_Field&); // not implemented
};

/////////////////////////////////////////////////////////////////////////////

#if q4_INLINE
#include "field.inl"
#endif

/////////////////////////////////////////////////////////////////////////////

#endif
