// $Id: UgliDbiScintPlnStruct.h,v 1.14 2005/08/26 19:00:02 rhatcher Exp $

#ifndef UGLIDBISCINTPLNSTRUCT_H
#define UGLIDBISCINTPLNSTRUCT_H

////////////////////////////////////////////////////////////////////////
// UgliDbiScintPlnStruct
//
// Package: UgliGeometry
//
// Concept:
//
//
// R. Hatcher 2001-08-08
////////////////////////////////////////////////////////////////////////

#include "UgliGeometry/UgliDbiStructHash.h"
#include "DatabaseInterface/DbiTableRow.h"
#include "LeakChecker/Lea.h"

class DbiValidityRec;

#include <iosfwd>

class UgliDbiScintPlnStruct;
std::ostream& operator<<(std::ostream& os, const UgliDbiScintPlnStruct& udsps);

class UgliDbiScintPlnStruct : public DbiTableRow
{

public:

// Constructors and destructors.

   UgliDbiScintPlnStruct()
      : fDetViewCover(), fNModules(0) { LEA_CTOR; };

   UgliDbiScintPlnStruct(PlexPlaneId plnid, UInt_t nmodules)
      : fDetViewCover(plnid), fNModules(nmodules) { LEA_CTOR; };

   UgliDbiScintPlnStruct(Detector::Detector_t detector,
                         PlaneView::PlaneView_t view,
                         PlaneCoverage::PlaneCoverage_t coverage,
                         Int_t nmodules)
      : fDetViewCover(detector,view,coverage,0),
        fNModules(nmodules) { LEA_CTOR; };

   virtual ~UgliDbiScintPlnStruct(){ LEA_DTOR; };

// State testing member functions

          UInt_t GetIndex(UInt_t defIndex) const;

   Detector::Detector_t            GetDetector() const;
   PlaneView::PlaneView_t          GetPlaneView() const;
   PlaneCoverage::PlaneCoverage_t  GetPlaneCoverage() const;

   Short_t       GetNModules() const;
   
   virtual DbiTableRow* CreateTableRow() const { return new UgliDbiScintPlnStruct; }

// I/O  member functions

   virtual void          Fill(DbiResultSet& rs,
                              const DbiValidityRec* vrec);
   virtual void          Store(DbiOutRowStream& ors,
                               const DbiValidityRec* vrec) const;

   virtual std::ostream& FormatToOStream(std::ostream& os, 
                                         Option_t *option="",
                                         const DbiValidityRec* vrec=0) const;
   virtual void          Print(Option_t *option="") const;

   static const char*    GetTableDescr();
   static void           SetDefensiveUnpkg(Bool_t defensive) 
      { fgDefensiveUnpkg = defensive; }
   static Bool_t         GetDefensiveUnpkg() { return fgDefensiveUnpkg; }

private:  

// Constructors and destructors.

   UgliDbiScintPlnStruct(const UgliDbiScintPlnStruct& from)
     : DbiTableRow(from) { LEA_CTOR; *this = from; }

// Data members

   UgliDbiStructHash fDetViewCover; // detector, plnview, plncoverage
   UShort_t          fNModules;     // number of modules in this plane type

// class-wide static

   static Bool_t fgDefensiveUnpkg;

ClassDef(UgliDbiScintPlnStruct,0)

};

inline Detector::Detector_t UgliDbiScintPlnStruct::GetDetector() const
{ return fDetViewCover.GetDetector(); }

inline PlaneView::PlaneView_t UgliDbiScintPlnStruct::GetPlaneView() const
{ return fDetViewCover.GetPlaneView(); }

inline PlaneCoverage::PlaneCoverage_t  UgliDbiScintPlnStruct::GetPlaneCoverage() const
{ return fDetViewCover.GetPlaneCoverage(); }

inline Short_t UgliDbiScintPlnStruct::GetNModules() const
{ return fNModules; }

inline UInt_t UgliDbiScintPlnStruct::GetIndex(UInt_t /* defIndex */) const 
{ return fDetViewCover.HashAsPlane(); }

#endif  // UGLIDBISCINTPLNSTRUCT_H
