⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 toptions.h.svn-base

📁 ffshow源码
💻 SVN-BASE
字号:
#ifndef _TOPTIONS_H_#define _TOPTIONS_H_#include "FastDelegate.h"struct TffdshowParamInfo;class TintStrColl;struct TregOp;struct TcreateParamListBase;struct Toptions{private: TintStrColl *coll;public:  typedef int Toptions::*TintVal; typedef fastdelegate::FastDelegate2<int,int> TsendOnChange; template<class T> struct TintOptionT  {    typedef int Tval;   int id;   int T::*val;   int min,max;//meaning   //-------------------   //   0   0    on/off switch   //  -1  -1    readonly   //  -2  -2    not accessible   //  -3  -3    dynamic min,max   // if min==max && min>0 - any value allowed   typedef fastdelegate::FastDelegate2<int,Tval> TonChangeBind;    const char_t *name;   bool inPreset;   const char_t *regname; //if NULL, don't perform registry operations   static const int DEF_DYN=13245364;   Tval def; //HACK: if DYN_DEF, call getDefault  };  struct TintOption : TintOptionT<Toptions>  {    bool get(Toptions *self,Tval *valPtr) const;   void set(Toptions *self,Tval val,const TsendOnChange &sendOnChange,const TonChangeBind &onChangeBind) const;   bool inv(Toptions *self,const TsendOnChange &sendOnChange,const TonChangeBind &onChangeBind) const;   void getInfo(Toptions *self,TffdshowParamInfo *info) const;   void reg_op(Toptions *self,TregOp &t) const;   void reset(Toptions *self) const;   void reset(Toptions *self,const TsendOnChange &sendOnChange,const TonChangeBind &onChangeBind) const;  };  typedef char_t Toptions::*TstrVal; struct TstrOption  {   typedef const char_t* Tval;   int id;   TstrVal val;   size_t buflen; //if 0, readonly   typedef fastdelegate::FastDelegate2<int,Tval> TonChangeBind;    const char_t *name;   bool inPreset;   const char_t *regname; //if NULL, don't perform registry operations   Tval def; //if NULL, call getDefaultStr   bool get(Toptions *self,Tval *valPtr) const;   void set(Toptions *self,Tval val,const TsendOnChange &sendOnChange,const TonChangeBind &onChangeBind) const;   void getInfo(Toptions *self,TffdshowParamInfo *info) const;   void reg_op(Toptions *self,TregOp &t) const;   void reset(Toptions *self) const;   void reset(Toptions *self,const TsendOnChange &sendOnChange,const TonChangeBind &onChangeBind) const;  }; template<class Topt> void getInfo(const Topt *self,TffdshowParamInfo *info);protected: Toptions& operator=(const Toptions &src)  {   return *this;  } template<class T> void addOptions(const TintOptionT<T> *iopts) {addOptions((const TintOption*)iopts);}void addOptions(const TintOption *iopts); void addOptions(const TstrOption *sopts); template<class Tobj,class Tfunc> void setOnChange(int id,Tobj *obj,Tfunc func) const; bool notifyChange(int id,int val); bool notifyChange(int id,const char_t *val); virtual void getMinMax(int id,int &min,int &max) {}  virtual int getDefault(int id) {return 0;} virtual void getDefaultStr(int id,char_t *buf,size_t buflen) {}  void resetValues(const int *ids); void setParamList(int id,const TcreateParamListBase *createParamList);public:   Toptions(TintStrColl *Icoll); virtual ~Toptions(); virtual void reg_op(TregOp &t);};typedef std::vector< std::pair<int,const char_t*> > TparamListItems;struct TcreateParamListBase {  virtual TparamListItems* create() const =0; };struct TcreateParamList1 : TcreateParamListBase{private: const char_t* *items;public:  TcreateParamList1(const char_t* *Iitems):items(Iitems) {} virtual TparamListItems* create(void) const  {   TparamListItems *it=new TparamListItems;   for (int i=0;items[i];i++)    it->push_back(std::make_pair(i,items[i]));   return it;  }};template<class T> struct TcreateParamList2 : TcreateParamListBase{private:  const T *self; const char_t* T::*ls;public:  TcreateParamList2(const T *Iself,const char_t* T::*Ils):self(Iself),ls(Ils) {} virtual TparamListItems* create(void) const  {   TparamListItems *it=new TparamListItems;   for (int i=0;(self+i)->*ls;i++)    it->push_back(std::make_pair(i,(self+i)->*ls));   return it;  }};template<class T> struct TcreateParamList3 : TcreateParamListBase{private: const T *self; const int T::*li; const char_t* T::*ls;public: TcreateParamList3(const T *Iself,const int T::*Ili,const char_t* T::*Ils):self(Iself),li(Ili),ls(Ils) {} virtual TparamListItems* create(void) const  {   TparamListItems *it=new TparamListItems;   for (int i=0;(self+i)->*ls;i++)    it->push_back(std::make_pair((self+i)->*li,(self+i)->*ls));   std::sort(it->begin(),it->end());    return it;  }};template<class Toption> struct TcollOption{ TcollOption():coll(NULL),option(NULL),createParamList(NULL) {} TcollOption(Toptions *Icoll,const Toption *Ioption):coll(Icoll),option(Ioption),createParamList(NULL) {} Toptions *coll; const Toption *option; typename Toption::TonChangeBind onChange; const TcreateParamListBase *createParamList;};template<class Toption,class Tbase=std::hash_map<int,TcollOption<Toption> > > class TcollOptions :public Tbase{private: template<class T> struct TonChangeCmp  {  private:   T &o;  public:   TonChangeCmp(T &Io):o(Io) {}   bool operator()(const T *o2)    {     return o==*o2;    }  }; typedef typename Toption::Tval Tval; public: bool get(int id,Tval *valPtr)  {   typename Tbase::const_iterator o=this->find(id);   return o==this->end()?false:o->second.option->get(o->second.coll,valPtr);   } bool set(int id,Tval val,const Toptions::TsendOnChange &sendOnChange)  {   typename Tbase::const_iterator o=this->find(id);   return o==this->end()?false:(o->second.option->set(o->second.coll,val,sendOnChange,o->second.onChange),true);  } bool reset(int id,const Toptions::TsendOnChange &sendOnChange)  {   typename Tbase::const_iterator o=this->find(id);   return o==this->end()?false:(o->second.option->reset(o->second.coll,sendOnChange,o->second.onChange),true);  }  bool getInfo(int id,TffdshowParamInfo *info); void getInfoIDs(ints &infos); bool notify(int id,Tval val); TparamListItems* getParamList(int id); void addOptions(const Toption *opts,Toptions *coll); void removeColl(Toptions *coll); void setOnChange(int id,const typename Toption::TonChangeBind &bind); void notifyParamsChanged(void); void reg_op(TregOp &t,Toptions *coll); void reset(const int *idBegin,const int *idEnd,Toptions *coll); void setParamList(int id,const TcreateParamListBase *createParamList);};class TcollIntOptions :public TcollOptions<Toptions::TintOption>{public: bool inv(int id,const Toptions::TsendOnChange &sendOnChange)  {   const_iterator o=this->find(id);   return o==this->end()?false:o->second.option->inv(o->second.coll,sendOnChange,o->second.onChange);   }};class TcollStrOptions :public TcollOptions<Toptions::TstrOption>{};class TintStrColl :protected std::pair<TcollIntOptions,TcollStrOptions>{private: Toptions::TsendOnChange sendOnChange;public: void addOptions(const Toptions::TintOption *iopts,Toptions *coll); void addOptions(const Toptions::TstrOption *sopts,Toptions *coll); void removeColl(Toptions *coll); void setOnChange(int id,const Toptions::TintOption::TonChangeBind &bind); void setOnChange(int id,const Toptions::TstrOption::TonChangeBind &bind); void setSendOnChange(const Toptions::TsendOnChange &IsendOnChange); void notifyParamsChanged(void); void reg_op(TregOp &t,Toptions *coll); void reset(const int *ids,Toptions *coll); bool reset(int id); void setParamList(int id,const TcreateParamListBase *createParamList);  bool get(int id,int *valPtr) {return first.get(id,valPtr);} bool set(int id,int val) {return first.set(id,val,sendOnChange);} bool inv(int id) {return first.inv(id,sendOnChange);} bool notifyParam(int id,int val); bool get(int id,const char_t* *valPtr) {return second.get(id,valPtr);} bool set(int id,const char_t *val) {return second.set(id,val,sendOnChange);} bool notifyParam(int id,const char_t *val); bool getInfo(int id,TffdshowParamInfo *info); void getInfoIDs(ints &infos); TparamListItems* getParamList(int id);};template<class Tobj,class Tfunc> inline void Toptions::setOnChange(int id,Tobj *obj,Tfunc func) const{ if (coll) coll->setOnChange(id,fastdelegate::MakeDelegate(obj,func));}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -