    // ------------------------------- //
    // -------- Start of File -------- //
    // ------------------------------- //
    // ----------------------------------------------------------- //
    // C++ Header File Name: grocery.h
    // Compiler Used: MSVC, BCC32, GCC, HPUX aCC, SOLARIS CC
    // Produced By: glNET Software
    // File Creation Date: 09/18/1997
    // Date Last Modified: 05/25/2001
    // Copyright (c) 2001 glNET Software
    // ----------------------------------------------------------- //
    // ---------- Include File Description and Details  ---------- //
    // ----------------------------------------------------------- //
    /*
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
    USA

    This is a test program use to test the Persistent base class.
    */
    // ----------------------------------------------------------- //
    #ifndef __GROCERY_HPP__
    #define __GROCERY_HPP__

    #include "gpersist.h"
    #include "gxfloat.h"

    // Type definitions
    typedef char * Name_t;         // String type
    typedef gxFLOAT64 Price_t;     // Floating point type
    typedef gxINT32 StockNumber_t; // Integer type

    // Constants
    const unsigned MAX_NAME_LENGTH = 64;   // Max object name length
    const gxClassID ClassGroceryID = 1024; // Arbitrary class ID
    const Name_t null_name = 0;            // Value used for null item names

    // Primary key type used by this database
    struct GroceryKey_t
    {
      char object_name[MAX_NAME_LENGTH]; // Object name
      gxObjectID object_id; // Object data file address/identification number
      gxClassID class_id;   // Object class identification number
    };

    // Primary key class used by this database
    class GroceryKey : public DatabaseKeyB
    {
    public:
      GroceryKey();
      GroceryKey(const char *name, gxObjectID oid = (gxObjectID_t)0,
    	     gxClassID cid = (gxClassID_t)0);

    public: // Base class interface
      size_t KeySize() { return sizeof(key); }
      int operator==(const DatabaseKeyB& k) const;
      int operator>(const DatabaseKeyB& k) const;

    public:
      char *ObjectName() { return key.object_name; }
      gxObjectID ObjectID() const { return key.object_id; }
      gxClassID ClassID() const { return key.class_id; }
      void SetObjectName(const char *s);
      void SetObjectID(gxObjectID oid) { key.object_id = oid; }
      void SetClassID(gxClassID cid) { key.class_id = cid; }

    private:
      GroceryKey_t key;
    };

    // Persistent object database
    class Grocery : public gxPersistent
    {
    public:
      Grocery(POD *pod) : gxPersistent(pod) {
        name = null_name; stock_number = (StockNumber_t)0; price = (Price_t)0;
      }
      Grocery(const POD *pod) : gxPersistent(pod) {
        name = null_name; stock_number = (StockNumber_t)0; price = (Price_t)0;
      }
      Grocery() {
        name = null_name; stock_number = (StockNumber_t)0; price = (Price_t)0;
      }

    public:
      StockNumber_t StockNumber() { return stock_number; }
      Price_t Price() { return price; }
      Name_t Name() { return name; }
      void SetStockNumber(StockNumber_t n) { stock_number = n; }
      void SetPrice(Price_t p) { price = p; }
      void SetName(Name_t n) { name = n; }
      void ClearName();

    public: // Database utility functions
      int CompareIndex(unsigned index_number);
      int RebuildIndexFile(const char *fname, unsigned index_number,
    		       int num_trees, BtreeNodeOrder_t node_order);

    public: // Runtime type information functions
      gxClassID GetClassID() { return ClassGroceryID; }
      const char *GetClassName() { return (const char *)"Class Grocery"; }

    private: // Base class interface
      virtual gxDatabaseError Write();
      virtual gxDatabaseError Read(FAU Address);
      virtual int Find();
      virtual int Delete();
      virtual __UWORD__ ObjectLength();

    private:
      Name_t name;
      StockNumber_t stock_number;
      Price_t price;
    };

    #endif // __GROCERY_HPP__
    // ----------------------------------------------------------- //
    // ------------------------------- //
    // --------- End of File --------- //
    // ------------------------------- //