// @(#)root/table:$Id$
// Author: Valery Fine(fine@mail.cern.ch)   03/07/98

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TDataSet
#define ROOT_TDataSet


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TDataSet                                                             //
//                                                                      //
// TDataSet class is a base class to implement the directory-like       //
// data structures and maintain it via TDataSetIter class iterator      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TList.h"
#include "TObjArray.h"

#include "TNamed.h"
#include "TNode.h"

class TDataSetIter;
class TBrowser;

class TDataSet : public TNamed
{
friend class TDataSetIter;
public:
   // The control codes to navigate the TDataSet structure via TDataSet::Pass method

   typedef enum {
         kContinue,  // continue passing
         kPrune,     // stop passing of the current branch but continue with the next one if any
         kStop,      // break passing
         kUp,        // break passing, return to the previous level, then continue
         kStruct,    // work with structural links only
         kAll,       // work with all links
         kRefs,      // work with refs links only
         kMarked     // work with marked links only
    } EDataSetPass;

private:
   void operator=(const TDataSet &){}
// --   Int_t IncCnt(){ fCnt++; return fCnt;}
// --   Int_t DecCnt(){ fCnt--; return fCnt;}
// --   Int_t Cnt()   { return fCnt;}
protected:
   static TDataSet    *fgMainSet; // pointer the main dataset;
   TDataSet           *fParent;   // pointer to mother of the directory
   TSeqCollection     *fList;     // List of the the the objects included into this dataset
// --     Int_t               fCnt;      // reference counter.
   virtual void SetMother(TObject *mother) {SetParent((TDataSet*)mother);}
   TDataSet(const char *name,const char *title):
   TNamed(name,title),fParent(0),fList(0){} // to support TDictionary
   void AddMain(TDataSet *set);
   static EDataSetPass SortIt(TDataSet *ds);
   static EDataSetPass SortIt(TDataSet *ds,void *user);
   TDataSet *GetRealParent();
   void MakeCollection();


public:

   //----- dataset flags
   enum ESetBits {
      kMark        = BIT(22)   // if object is marked
     ,kArray       = BIT(20)   // if object has TObjArray inside
   };

   enum EBitOpt {
               kSet   = kTRUE,
               kReset = kFALSE
             };

   TDataSet(const char *name="", TDataSet *parent=0,  Bool_t arrayFlag = kFALSE);
   TDataSet(const TDataSet &src,EDataSetPass iopt=kAll);
   TDataSet(TNode &src);
   virtual ~TDataSet();
   virtual void         Add(TDataSet *dataset);
   virtual void         AddAt(TDataSet *dataset,Int_t idx=0);
   virtual void         AddAtAndExpand(TDataSet *dataset, Int_t idx=0);
   virtual void         AddFirst(TDataSet *dataset);
   virtual void         AddLast(TDataSet *dataset);
   TDataSet            *At(Int_t idx) const;
   virtual void         Browse(TBrowser *b);
   virtual TObject     *Clone(const char *newname="") const;
   virtual void         Delete(Option_t *opt="");
   virtual TDataSet    *Find(const char *path) const;
   virtual TDataSet    *FindByName(const char *name,const char *path="",Option_t *opt="") const;
   virtual TDataSet    *FindByPath(const char *path) const;
   virtual TDataSet    *FindByTitle(const char *title,const char *path="",Option_t *opt="") const;
   TObject             *FindObject(const char *name) const {return FindByName(name);}
   TObject             *FindObject(const TObject *o)  const { return TObject::FindObject(o);}
   virtual TDataSet    *First() const;
   TObjArray           *GetObjArray() const { return (TObjArray *)fList; }
   virtual TSeqCollection *GetCollection() const { return (TSeqCollection *)fList; }
   TList               *GetList()   const { return (TList *)fList; }
   virtual Int_t        GetListSize() const;
   static  TDataSet    *GetMainSet();
   TObject             *GetMother() const { return (TObject*)GetParent();}
   virtual TObject     *GetObject() const;
   virtual TDataSet    *GetParent() const { return fParent;}
   virtual Long_t       HasData() const {return 0;}    // Check whether this dataset has extra "data-members"
   virtual TDataSet    *Instance() const;
   static  TDataSet    *instance();
   virtual TString      Path() const;                  // return the "full" path of this dataset
   virtual EDataSetPass Pass(EDataSetPass ( *callback)(TDataSet *),Int_t depth=0);
   virtual EDataSetPass Pass(EDataSetPass ( *callback)(TDataSet *,void*),void *user,Int_t depth=0);
   virtual void         PrintContents(Option_t *opt="") const;
   virtual Int_t        Purge(Option_t *opt="");
   virtual void         Remove(TDataSet *set);
   virtual TDataSet    *RemoveAt(Int_t idx);
   virtual void         SetMother(TDataSet *parent=0){SetParent(parent);};
   virtual void         SetObject(TObject *obj);
   virtual void         SetParent(TDataSet *parent=0);
   virtual void         SetWrite();
   virtual void         Shunt(TDataSet *newParent=0);
   virtual void         Sort();                        //Sort objects in lexical order
   virtual Bool_t       IsEmpty() const;
   virtual Bool_t       IsFolder() const {return kTRUE;}
   virtual Bool_t       IsMarked() const ;
   virtual Bool_t       IsThisDir(const char *dirname,int len=-1,int ignorecase=0) const ;
   virtual TDataSet    *Last() const;
   virtual void         ls(Option_t *option="")  const;      // Option "*" means print all levels
   virtual void         ls(Int_t depth)  const;              // Print the "depth" levels of this datatset
   void                 Mark();                              // *MENU*
   void                 UnMark();                            // *MENU*
   void                 MarkAll();                           // *MENU*
   void                 UnMarkAll();                         // *MENU*
   void                 InvertAllMarks();                    // *MENU*
   void                 Mark(UInt_t flag,EBitOpt reset=kSet);
   virtual TDataSet    *Next() const;
   virtual TDataSet    *Prev() const;
   virtual void         Update();                            // Update dataset
   virtual void         Update(TDataSet *set,UInt_t opt=0);// Update this dataset with the new one
   virtual Int_t        Write(const char *name=0, Int_t option=0, Int_t bufsize=0);
   virtual Int_t        Write(const char *name=0, Int_t option=0, Int_t bufsize=0) const;
   ClassDef(TDataSet,1) // The base class to create the hierarchical data structures
};

inline void        TDataSet::Add(TDataSet *dataset){ AddLast(dataset); }
inline TDataSet   *TDataSet::At(Int_t idx) const {return fList ? (TDataSet *)fList->At(idx) : 0;  }
inline Int_t       TDataSet::GetListSize() const {return (fList) ? fList->GetSize():0;}
inline TDataSet   *TDataSet::instance() { return new TDataSet();}
inline Bool_t      TDataSet::IsMarked() const { return TestBit(kMark); }
inline void        TDataSet::Mark(UInt_t flag,EBitOpt reset){ SetBit(flag,reset); }
inline void        TDataSet::Mark()     { Mark(kMark,kSet); }
inline void        TDataSet::UnMark()   { Mark(kMark,kReset); }


#endif
 TDataSet.h:1
 TDataSet.h:2
 TDataSet.h:3
 TDataSet.h:4
 TDataSet.h:5
 TDataSet.h:6
 TDataSet.h:7
 TDataSet.h:8
 TDataSet.h:9
 TDataSet.h:10
 TDataSet.h:11
 TDataSet.h:12
 TDataSet.h:13
 TDataSet.h:14
 TDataSet.h:15
 TDataSet.h:16
 TDataSet.h:17
 TDataSet.h:18
 TDataSet.h:19
 TDataSet.h:20
 TDataSet.h:21
 TDataSet.h:22
 TDataSet.h:23
 TDataSet.h:24
 TDataSet.h:25
 TDataSet.h:26
 TDataSet.h:27
 TDataSet.h:28
 TDataSet.h:29
 TDataSet.h:30
 TDataSet.h:31
 TDataSet.h:32
 TDataSet.h:33
 TDataSet.h:34
 TDataSet.h:35
 TDataSet.h:36
 TDataSet.h:37
 TDataSet.h:38
 TDataSet.h:39
 TDataSet.h:40
 TDataSet.h:41
 TDataSet.h:42
 TDataSet.h:43
 TDataSet.h:44
 TDataSet.h:45
 TDataSet.h:46
 TDataSet.h:47
 TDataSet.h:48
 TDataSet.h:49
 TDataSet.h:50
 TDataSet.h:51
 TDataSet.h:52
 TDataSet.h:53
 TDataSet.h:54
 TDataSet.h:55
 TDataSet.h:56
 TDataSet.h:57
 TDataSet.h:58
 TDataSet.h:59
 TDataSet.h:60
 TDataSet.h:61
 TDataSet.h:62
 TDataSet.h:63
 TDataSet.h:64
 TDataSet.h:65
 TDataSet.h:66
 TDataSet.h:67
 TDataSet.h:68
 TDataSet.h:69
 TDataSet.h:70
 TDataSet.h:71
 TDataSet.h:72
 TDataSet.h:73
 TDataSet.h:74
 TDataSet.h:75
 TDataSet.h:76
 TDataSet.h:77
 TDataSet.h:78
 TDataSet.h:79
 TDataSet.h:80
 TDataSet.h:81
 TDataSet.h:82
 TDataSet.h:83
 TDataSet.h:84
 TDataSet.h:85
 TDataSet.h:86
 TDataSet.h:87
 TDataSet.h:88
 TDataSet.h:89
 TDataSet.h:90
 TDataSet.h:91
 TDataSet.h:92
 TDataSet.h:93
 TDataSet.h:94
 TDataSet.h:95
 TDataSet.h:96
 TDataSet.h:97
 TDataSet.h:98
 TDataSet.h:99
 TDataSet.h:100
 TDataSet.h:101
 TDataSet.h:102
 TDataSet.h:103
 TDataSet.h:104
 TDataSet.h:105
 TDataSet.h:106
 TDataSet.h:107
 TDataSet.h:108
 TDataSet.h:109
 TDataSet.h:110
 TDataSet.h:111
 TDataSet.h:112
 TDataSet.h:113
 TDataSet.h:114
 TDataSet.h:115
 TDataSet.h:116
 TDataSet.h:117
 TDataSet.h:118
 TDataSet.h:119
 TDataSet.h:120
 TDataSet.h:121
 TDataSet.h:122
 TDataSet.h:123
 TDataSet.h:124
 TDataSet.h:125
 TDataSet.h:126
 TDataSet.h:127
 TDataSet.h:128
 TDataSet.h:129
 TDataSet.h:130
 TDataSet.h:131
 TDataSet.h:132
 TDataSet.h:133
 TDataSet.h:134
 TDataSet.h:135
 TDataSet.h:136
 TDataSet.h:137
 TDataSet.h:138
 TDataSet.h:139
 TDataSet.h:140
 TDataSet.h:141
 TDataSet.h:142
 TDataSet.h:143
 TDataSet.h:144
 TDataSet.h:145
 TDataSet.h:146
 TDataSet.h:147
 TDataSet.h:148
 TDataSet.h:149
 TDataSet.h:150
 TDataSet.h:151
 TDataSet.h:152
 TDataSet.h:153
 TDataSet.h:154
 TDataSet.h:155
 TDataSet.h:156
 TDataSet.h:157
 TDataSet.h:158
 TDataSet.h:159
 TDataSet.h:160