Listing 3

// Record and Field class definitions

namespace OpenRJ
{
  public __gc class Field;
  public __gc class Record;
  public __gc class Database;
}
namespace OpenRJ
{
  [System::Reflection::DefaultMemberAttribute("Item")]
  public __gc __abstract class Database
  {
  /// Construction
  protected:
    Database(::openrj::ORJDatabaseA const *database);
  public:
    ~Database();
  /// Operations
  private:
    void Close();
  protected:
    void Dispose();
  /// Properties
  public:
    /// The number of lines in the database
    __property int            get_NumLines();
    /// The number of fields in the database
    __property int            get_NumFields();
    /// The number of records in the database
    __property int            get_NumRecords();

    /// Enumerate the records in the database
    IEnumerator               *GetEnumerator();

    /// Access the records by index
    __property virtual Record *get_Item(int index);

  /// Members
  private:
    ::openrj::ORJDatabaseA const  *m_database;
    ArrayList                     *m_records;
  };
}
namespace OpenRJ
{
  [System::Reflection::DefaultMemberAttribute("Item")]
  public __gc __sealed class Record
  {
  /// Construction
  private public:
    Record( ::openrj::ORJRecordA const *record
          , ::OpenRJ::Database *database);
  /// Properties
  public:
    /// The number of fields in the record
    __property int                get_NumFields();

    /// The record within which this record resides
    __property ::OpenRJ::Database *get_Database();
    /// Enumerate the fields in the record
    IEnumerator                   *GetEnumerator();

    /// Access the fields by index
    __property Field              *get_Item(int index);
#ifdef INDEXER_RETURNS_STRING
    __property String             *get_Item(String *fieldName);
#else /* ? INDEXER_RETURNS_STRING */
    __property Field              *get_Item(String *fieldName);
#endif /* INDEXER_RETURNS_STRING */
    /// Converts the record to a string form
    String                        *ToString();
  /// Members
  private:
    ::openrj::ORJRecordA const  *m_record;
    ::OpenRJ::Database          *m_database;
    ArrayList                   *m_fields;
  };
}
namespace OpenRJ
{
  public __gc __sealed class Field
  {
  /// Construction
  private public:
    Field(::openrj::ORJFieldA const *field, ::OpenRJ::Record *record);
  /// Properties
  public:
    /// The name of the field
    __property String           *get_Name();
    /// The value of the field
    __property String           *get_Value();

    /// The record within which this field resides
    __property ::OpenRJ::Record *get_Record();

    /// Converts the field to a string form
    String                      *ToString();
  /// Members
  public private:
    ::openrj::ORJFieldA const *m_field;
  private:
    ::OpenRJ::Record          *m_record;
  };
}