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

📄 toptions.h

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 H
字号:
#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 + -