• Main Page
  • Namespaces
  • Classes
  • Files
  • File List

transl.h

00001 #ifndef transl_h
00002 #define transl_h
00003 
00004 /*+
00005 ________________________________________________________________________
00006 
00007  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
00008  Author:        A.H.Bril
00009  Date:          21-10-1995
00010  Contents:      Translators
00011 RCS:            $Id: transl.h,v 1.37 2009-07-22 16:01:16 cvsbert Exp $
00012 ________________________________________________________________________
00013 
00014 A translator is an object specific for a certain storage mechanism coupled with
00015 specific details about e.g. vendor specific file transls. A Translator is member
00016 of a group, e.g. the Grid Translator group. Translator groups have a
00017 description of IOObj context.
00018 
00019 */
00020 
00021 #include "refcount.h"
00022 #include "objectset.h"
00023 #include "callback.h"
00024 #include "bufstring.h"
00025 #include "streamconn.h"
00026 #include "ctxtioobj.h"
00027 class IOPar;
00028 class Translator;
00029 
00030 #define mDGBKey "dGB"
00031 #define mdTectKey "dTect"
00032 
00033 #define mObjSelUnrelated        0
00034 #define mObjSelRelated          1
00035 #define mObjSelMatch            2
00036 mGlobal int defaultSelector(const char*,const char*);
00037 
00038 
00053 mClass TranslatorGroup
00054 { mRefCountImpl(TranslatorGroup);
00055 public:
00056 
00057                                 TranslatorGroup( const char* clssnm,
00058                                                  const char* usrnm );
00059 
00060     const BufferString&         clssName() const        { return clssname_; }
00061     const BufferString&         userName() const        { return usrname_; }
00062     virtual Translator*         make(const char*,bool usrnm=true) const;
00063     const Translator*           getTemplate(const char*,bool usrnm) const;
00064 
00065     const ObjectSet<const Translator>& templates() const { return templs_; }
00066 
00067     virtual const IOObjContext& ioCtxt() const          = 0;
00068     virtual int                 objSelector(const char*) const = 0;
00070 
00071     bool                        hasConnType(const char*) const;
00072     virtual const char*         defExtension() const    { return 0; }
00073     IOPar&                      selHist();
00074     void                        clearSelHist();
00075 
00076     static const ObjectSet<TranslatorGroup>& groups()   { return getGroups(); }
00077     static TranslatorGroup&     getGroup(const char* nm,bool usr=true);
00078 
00079                                 // Called from macros
00080     int                         add(Translator*);
00081     static TranslatorGroup&     addGroup(TranslatorGroup*);
00082 
00083 protected:
00084 
00085     BufferString                clssname_;
00086     BufferString                usrname_;
00087     ObjectSet<const Translator> templs_;
00088     IOPar*                      selhist_;
00089 
00090     static ObjectSet<TranslatorGroup>& getGroups();
00091 
00092 };
00093 
00094 
00110 mClass Translator : public CallBacker
00111 {
00112 public:
00113                                 Translator( const char* nm, const char* unm )
00114                                 : typname_(nm)
00115                                 , usrname_(unm)
00116                                 , group_(0)             {}
00117     virtual                     ~Translator()           {}
00118 
00119     const BufferString&         typeName() const        { return typname_; }
00120     const BufferString&         userName() const        { return usrname_; }
00121     const TranslatorGroup*      group() const           { return group_; }
00122 
00123     virtual Translator*         getNew() const          = 0;
00124 
00125     virtual bool                implExists(const IOObj*,int forread) const;
00126     virtual bool                implReadOnly(const IOObj*) const;
00127     virtual bool                implRemove(const IOObj*) const;
00128     virtual bool                implShouldRemove(const IOObj*) const;
00129     virtual bool                implRename(const IOObj*,const char*,
00130                                                 const CallBack* cb=0) const;
00131     virtual bool                implSetReadOnly(const IOObj*,bool) const;
00132 
00133     virtual const char*         connType() const;
00134     virtual void                usePar(const IOPar&)            {}
00135     virtual const char*         defExtension() const
00136                                 { return group_ ? group_->defExtension() : 0; }
00137 
00138     void                        setGroup( TranslatorGroup* g )  { group_ = g; }
00139 
00140     virtual bool                isReadDefault() const           { return true; }
00143 
00144 protected:
00145 
00146     BufferString                typname_;
00147     BufferString                usrname_;
00148     TranslatorGroup*            group_;
00149 
00150 };
00151 
00152 
00153 // Essential macros for implementing the concept
00154 
00156 #define isTranslatorGroup(clss) \
00157 public: \
00158     static TranslatorGroup& theInst();  \
00159     static int selector(const char*); \
00160     static const IOObjContext& ioContext(); \
00161     virtual const IOObjContext& ioCtxt() const { return ioContext(); } \
00162     virtual int objSelector( const char* s ) const { return selector(s); } \
00163 
00164 
00166 #define isTranslator(spec,clss) \
00167 public: \
00168     Translator* getNew() const \
00169     { \
00170         Translator* tr = new spec##clss##Translator(typeName().buf(), \
00171                                                     userName().buf()); \
00172         tr->setGroup( group_ ); return tr; \
00173     } \
00174     static spec##clss##Translator* getInstance(); \
00175     static const char* translKey(); \
00176     static int listID() ; \
00177 
00178 
00179 #define defineTranslatorGroup(clss,usrnm) \
00180 static RefMan<TranslatorGroup> clss##inst = \
00181     &TranslatorGroup::addGroup( new clss##TranslatorGroup(#clss,usrnm) );\
00182 TranslatorGroup& clss##TranslatorGroup::theInst() \
00183 { return *clss##inst; }
00184 
00185 
00187 #define defineTranslator(spec,clss,usrnm) \
00188 static int spec##clss##listid_ \
00189     = TranslatorGroup::getGroup( #clss , false ).add( \
00190             new spec##clss##Translator( #spec, usrnm ) ); \
00191 int spec##clss##Translator::listID()    { return spec##clss##listid_; }\
00192 spec##clss##Translator* spec##clss##Translator::getInstance() \
00193 { return new spec##clss##Translator(#clss,usrnm); } \
00194 const char* spec##clss##Translator::translKey() { return usrnm; }
00195 
00196 
00197 
00200 #define mDefEmptyTranslatorGroupConstructor(clss) \
00201         clss##TranslatorGroup( const char* nm, const char* unm ) \
00202         : TranslatorGroup(nm,unm)               {}
00203 
00206 #define mDefEmptyTranslatorBaseConstructor(clss) \
00207         clss##Translator( const char* nm, const char* unm ) \
00208         : Translator(nm,unm)                    {}
00209 
00212 #define mDefEmptyTranslatorConstructor(spec,clss) \
00213         spec##clss##Translator( const char* nm, const char* unm ) \
00214         : clss##Translator(nm,unm)              {}
00215 
00219 #define mDeclEmptyTranslatorBundle(clss,fmt,defext) \
00220 mClass clss##TranslatorGroup : public TranslatorGroup \
00221 {                       isTranslatorGroup(clss) \
00222                         mDefEmptyTranslatorGroupConstructor(clss) \
00223     const char*         defExtension() const    { return defext; } \
00224 }; \
00225  \
00226 mClass clss##Translator : public Translator \
00227 { public: \
00228                         mDefEmptyTranslatorBaseConstructor(clss) \
00229 }; \
00230  \
00231 mClass fmt##clss##Translator : public clss##Translator \
00232 {                       isTranslator(fmt,clss) \
00233                         mDefEmptyTranslatorConstructor(fmt,clss) \
00234 };
00235 
00239 #define mDefSimpleTranslatorInstances(clss,usrnm,fmt) \
00240 defineTranslatorGroup(clss,usrnm) \
00241 defineTranslator(fmt,clss,#fmt)
00242 
00245 #define mDefSimpleTranslatorSelector(clss,usrnm) \
00246 int clss##TranslatorGroup::selector( const char* s ) \
00247 { return defaultSelector(usrnm,s); }
00248 
00252 #define mDefSimpleTranslatorioContextWithExtra(clss,stdtyp,extra) \
00253 const IOObjContext& clss##TranslatorGroup::ioContext() \
00254 { \
00255     static IOObjContext* ctxt = 0; \
00256     if ( !ctxt ) \
00257     { \
00258         ctxt = new IOObjContext( 0 ); \
00259         ctxt->stdseltype = IOObjContext::stdtyp; \
00260         extra; \
00261     } \
00262     ctxt->trgroup = &theInst(); \
00263     return *ctxt; \
00264 }
00265 
00268 #define mDefSimpleTranslatorioContext(clss,stdtyp) \
00269     mDefSimpleTranslatorioContextWithExtra(clss,stdtyp,)
00270 
00274 #define mDefSimpleTranslators(clss,usrnm,fmt,stdtyp) \
00275 mDefSimpleTranslatorInstances(clss,usrnm,fmt) \
00276 mDefSimpleTranslatorSelector(clss,usrnm) \
00277 mDefSimpleTranslatorioContext(clss,stdtyp)
00278 
00282 #define mDefSimpleTranslatorsWithCtioExtra(clss,usrnm,fmt,stdtyp,extra) \
00283 mDefSimpleTranslatorInstances(clss,usrnm,fmt) \
00284 mDefSimpleTranslatorSelector(clss,usrnm) \
00285 mDefSimpleTranslatorioContextWithExtra(clss,stdtyp,extra)
00286 
00291 #define mDefSimpleTranslatorsWithSelKey(clss,usrnm,fmt,stdtyp,selky) \
00292     mDefSimpleTranslatorsWithCtioExtra(clss,usrnm,fmt,stdtyp, \
00293                 ctxt->selkey = selky)
00294 
00295 
00296 // Convenience macros when using Translator(Group)-related classes
00297 
00298 #define mSelHist(clss) \
00299         clss##TranslatorGroup::theInst().selHist()
00300 
00301 #define mTranslCreate(clss,nm) \
00302         (clss##Translator*)clss##TranslatorGroup::theInst().make(nm)
00303 
00304 #define mTranslGroupName(clss) \
00305         clss##TranslatorGroup::theInst().userName()
00306 
00307 #define mTranslKey(clss) \
00308         clss##Translator::translKey()
00309 
00310 #define mMkCtxtIOObj(clss) \
00311         new CtxtIOObj(clss##TranslatorGroup::ioContext())
00312 
00313 #define mIOObjContext(clss) \
00314         clss##TranslatorGroup::ioContext()
00315 
00316 
00317 #endif

Generated on Tue Nov 30 2010 for General by  doxygen 1.7.1