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

#ifndef UGLIDBISCINTMDLSTRUCT_H
#define UGLIDBISCINTMDLSTRUCT_H

////////////////////////////////////////////////////////////////////////
// UgliDbiScintMdlStruct
//
// 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 UgliDbiScintMdlStruct;
std::ostream& operator<<(std::ostream& os, const UgliDbiScintMdlStruct& udsms);

class UgliDbiScintMdlStruct : public DbiTableRow
{

public:

// Constructors and destructors.

   UgliDbiScintMdlStruct()
      : fDetViewCoverMdl(), fTypeName("unknown"), 
        fFirstStrip(-1), fLastStrip(-1) { LEA_CTOR; };

   UgliDbiScintMdlStruct(PlexScintMdlId scintmdlid, std::string type,
                         Short_t first, Short_t last)
      : fDetViewCoverMdl(scintmdlid), fTypeName(type), 
        fFirstStrip(first), fLastStrip(last) { LEA_CTOR; };

   UgliDbiScintMdlStruct(Detector::Detector_t detector,
                         PlaneView::PlaneView_t view,
                         PlaneCoverage::PlaneCoverage_t coverage,
                         UShort_t module, std::string type, 
                         Short_t first, Short_t last)
      : fDetViewCoverMdl(detector,view,coverage,module), fTypeName(type), 
        fFirstStrip(first), fLastStrip(last) { LEA_CTOR; };

   virtual ~UgliDbiScintMdlStruct(){ 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;

   UShort_t      GetModule() const;
   std::string   GetTypeName() const { return fTypeName; }
   Short_t       GetFirstStrip() const { return fFirstStrip; }
   Short_t       GetLastStrip() const { return fLastStrip; }


   virtual DbiTableRow* CreateTableRow() const { return new UgliDbiScintMdlStruct; }

// 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.

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

// Data members

   UgliDbiStructHash fDetViewCoverMdl; // det,view,cover + module in type
   std::string       fTypeName;        // module style name
   Int_t             fFirstStrip;      // strip # in plane of first strip
   Int_t             fLastStrip;       // strip # in plane of last strip

// class-wide static

   static Bool_t fgDefensiveUnpkg;

ClassDef(UgliDbiScintMdlStruct,0)

};

inline Detector::Detector_t UgliDbiScintMdlStruct::GetDetector() const
{ return fDetViewCoverMdl.GetDetector(); }

inline PlaneView::PlaneView_t UgliDbiScintMdlStruct::GetPlaneView() const
{ return fDetViewCoverMdl.GetPlaneView(); }

inline PlaneCoverage::PlaneCoverage_t  UgliDbiScintMdlStruct::GetPlaneCoverage() const
{ return fDetViewCoverMdl.GetPlaneCoverage(); }

inline UShort_t UgliDbiScintMdlStruct::GetModule() const
{ return fDetViewCoverMdl.GetPart(); }

inline UInt_t UgliDbiScintMdlStruct::GetIndex(UInt_t /* defIndex */) const 
{ return fDetViewCoverMdl.HashAsScintMdl(); }

#endif  // UGLIDBISCINTMDLSTRUCT_H
