// @(#)root/core:$Id$
// author: Lukasz Janyst <ljanyst@cern.ch>

#ifndef ROOT_TSchemaRule
#define ROOT_TSchemaRule

class TBuffer;
class TVirtualObject;
class TObjArray;

#include "TObject.h"
#include "TNamed.h"
#include "Rtypes.h"
#include "TString.h"

#include <vector>
#include <utility>

namespace ROOT {

   class TSchemaRule: public TObject
   {
      public:

         class TSources : public TNamed {
         private:
            TString fDimensions;
         public:
            TSources(const char *name = 0, const char *title = 0, const char *dims = 0) : TNamed(name,title),fDimensions(dims) {}
            const char *GetDimensions() { return fDimensions; }

            ClassDef(TSources,2);
         };

         typedef enum
         {
            kReadRule    = 0,
            kReadRawRule = 1,
            kNone        = 99999
         }  RuleType_t;

         typedef void (*ReadFuncPtr_t)( char*, TVirtualObject* );
         typedef void (*ReadRawFuncPtr_t)( char*, TBuffer&);

         TSchemaRule();
         virtual ~TSchemaRule();

         TSchemaRule( const TSchemaRule& rhs );
         TSchemaRule& operator = ( const TSchemaRule& rhs );
         Bool_t operator == ( const TSchemaRule& rhs );


         void             Clear(Option_t * /*option*/ ="");
         Bool_t           SetFromRule( const char *rule );

         const char      *GetVersion( ) const;
         Bool_t           SetVersion( const TString& version );
         Bool_t           TestVersion( Int_t version ) const;
         Bool_t           SetChecksum( const TString& checksum );
         Bool_t           TestChecksum( UInt_t checksum ) const;
         void             SetSourceClass( const TString& classname );
         const char      *GetSourceClass() const;
         void             SetTargetClass( const TString& classname );
         const char      *GetTargetClass() const;
         void             SetTarget( const TString& target );
         const TObjArray* GetTarget() const;
         const char      *GetTargetString() const;
         void             SetSource( const TString& source );
         const TObjArray* GetSource() const;
         void             SetEmbed( Bool_t embed );
         Bool_t           GetEmbed() const;
         Bool_t           IsAliasRule() const;
         Bool_t           IsRenameRule() const;
         Bool_t           IsValid() const;
         void             SetCode( const TString& code );
         const char      *GetCode() const;
         void             SetAttributes( const TString& attributes );
         const char      *GetAttributes() const;
         Bool_t           HasTarget( const TString& target ) const;

         Bool_t           HasSource( const TString& source ) const;
         void             SetReadFunctionPointer( ReadFuncPtr_t ptr );
         ReadFuncPtr_t    GetReadFunctionPointer() const;
         void             SetReadRawFunctionPointer( ReadRawFuncPtr_t ptr );
         ReadRawFuncPtr_t GetReadRawFunctionPointer() const;
         void             SetInclude( const TString& include );
         const TObjArray* GetInclude() const;
         void             SetRuleType( RuleType_t type );
         RuleType_t       GetRuleType() const;
         Bool_t           Conflicts( const TSchemaRule* rule ) const;

         void             AsString( TString &out, const char *options = "" ) const;
         void             ls(Option_t *option="") const;

         ClassDef( TSchemaRule, 1 );

      private:

         Bool_t ProcessVersion( const TString& version ) const;
         Bool_t ProcessChecksum( const TString& checksum ) const;
         static void ProcessList( TObjArray* array, const TString& list );
         static void ProcessDeclaration( TObjArray* array, const TString& list );

         TString                      fVersion;        //  Source version string
         mutable std::vector<std::pair<Int_t, Int_t> >* fVersionVect;    //! Source version vector (for searching purposes)
         TString                      fChecksum;       //  Source checksum string
         mutable std::vector<UInt_t>* fChecksumVect;   //! Source checksum vector (for searching purposes)
         TString                      fSourceClass;    //  Source class
         TString                      fTargetClass;    //  Target class, this is the owner of this rule object.
         TString                      fTarget;         //  Target data mamber string
         mutable TObjArray*           fTargetVect;     //! Target data member vector (for searching purposes)
         TString                      fSource;         //  Source data member string
         mutable TObjArray*           fSourceVect;     //! Source data member vector (for searching purposes)
         TString                      fInclude;        //  Includes string
         mutable TObjArray*           fIncludeVect;    //! Includes vector
         TString                      fCode;           //  User specified code snippet
         Bool_t                       fEmbed;          //  Value determining if the rule should be embedded
         ReadFuncPtr_t                fReadFuncPtr;    //! Conversion function pointer for read rule
         ReadRawFuncPtr_t             fReadRawFuncPtr; //! Conversion function pointer for readraw rule
         RuleType_t                   fRuleType;       //  Type of the rule
         TString                      fAttributes;     //  Attributes to be applied to the member (like Owner/NotOwner)
   };
} // End of namespace ROOT

#endif // ROOT_TSchemaRule
 TSchemaRule.h:1
 TSchemaRule.h:2
 TSchemaRule.h:3
 TSchemaRule.h:4
 TSchemaRule.h:5
 TSchemaRule.h:6
 TSchemaRule.h:7
 TSchemaRule.h:8
 TSchemaRule.h:9
 TSchemaRule.h:10
 TSchemaRule.h:11
 TSchemaRule.h:12
 TSchemaRule.h:13
 TSchemaRule.h:14
 TSchemaRule.h:15
 TSchemaRule.h:16
 TSchemaRule.h:17
 TSchemaRule.h:18
 TSchemaRule.h:19
 TSchemaRule.h:20
 TSchemaRule.h:21
 TSchemaRule.h:22
 TSchemaRule.h:23
 TSchemaRule.h:24
 TSchemaRule.h:25
 TSchemaRule.h:26
 TSchemaRule.h:27
 TSchemaRule.h:28
 TSchemaRule.h:29
 TSchemaRule.h:30
 TSchemaRule.h:31
 TSchemaRule.h:32
 TSchemaRule.h:33
 TSchemaRule.h:34
 TSchemaRule.h:35
 TSchemaRule.h:36
 TSchemaRule.h:37
 TSchemaRule.h:38
 TSchemaRule.h:39
 TSchemaRule.h:40
 TSchemaRule.h:41
 TSchemaRule.h:42
 TSchemaRule.h:43
 TSchemaRule.h:44
 TSchemaRule.h:45
 TSchemaRule.h:46
 TSchemaRule.h:47
 TSchemaRule.h:48
 TSchemaRule.h:49
 TSchemaRule.h:50
 TSchemaRule.h:51
 TSchemaRule.h:52
 TSchemaRule.h:53
 TSchemaRule.h:54
 TSchemaRule.h:55
 TSchemaRule.h:56
 TSchemaRule.h:57
 TSchemaRule.h:58
 TSchemaRule.h:59
 TSchemaRule.h:60
 TSchemaRule.h:61
 TSchemaRule.h:62
 TSchemaRule.h:63
 TSchemaRule.h:64
 TSchemaRule.h:65
 TSchemaRule.h:66
 TSchemaRule.h:67
 TSchemaRule.h:68
 TSchemaRule.h:69
 TSchemaRule.h:70
 TSchemaRule.h:71
 TSchemaRule.h:72
 TSchemaRule.h:73
 TSchemaRule.h:74
 TSchemaRule.h:75
 TSchemaRule.h:76
 TSchemaRule.h:77
 TSchemaRule.h:78
 TSchemaRule.h:79
 TSchemaRule.h:80
 TSchemaRule.h:81
 TSchemaRule.h:82
 TSchemaRule.h:83
 TSchemaRule.h:84
 TSchemaRule.h:85
 TSchemaRule.h:86
 TSchemaRule.h:87
 TSchemaRule.h:88
 TSchemaRule.h:89
 TSchemaRule.h:90
 TSchemaRule.h:91
 TSchemaRule.h:92
 TSchemaRule.h:93
 TSchemaRule.h:94
 TSchemaRule.h:95
 TSchemaRule.h:96
 TSchemaRule.h:97
 TSchemaRule.h:98
 TSchemaRule.h:99
 TSchemaRule.h:100
 TSchemaRule.h:101
 TSchemaRule.h:102
 TSchemaRule.h:103
 TSchemaRule.h:104
 TSchemaRule.h:105
 TSchemaRule.h:106
 TSchemaRule.h:107
 TSchemaRule.h:108
 TSchemaRule.h:109
 TSchemaRule.h:110
 TSchemaRule.h:111
 TSchemaRule.h:112
 TSchemaRule.h:113
 TSchemaRule.h:114
 TSchemaRule.h:115
 TSchemaRule.h:116
 TSchemaRule.h:117
 TSchemaRule.h:118
 TSchemaRule.h:119
 TSchemaRule.h:120
 TSchemaRule.h:121
 TSchemaRule.h:122
 TSchemaRule.h:123
 TSchemaRule.h:124
 TSchemaRule.h:125