X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbindable.h;h=b2634ea92bd4b1b43bb1f88b502af230f1e3c4bd;hp=f534d7afd8e9788e412dd0d2ddd876eee0091c8e;hb=HEAD;hpb=f33a98b1a044c8ac7b12778cbca6c4a124875e4a diff --git a/source/bindable.h b/source/bindable.h deleted file mode 100644 index f534d7af..00000000 --- a/source/bindable.h +++ /dev/null @@ -1,161 +0,0 @@ -#ifndef MSP_GL_BINDABLE_H_ -#define MSP_GL_BINDABLE_H_ - -namespace Msp { -namespace GL { - -/** -A helper class for single-point binding. Provides tracking of the currently -bound object. -*/ -template -class Bindable -{ -protected: - static const T *cur_obj; - - Bindable() { } - - static bool set_current(const T *obj) - { - if(obj==cur_obj) - return false; - - cur_obj = obj; - return true; - } - -public: - static const T *current() { return cur_obj; } -}; - -template -const T *Bindable::cur_obj; - - -/** -A helper class for Bindables that revert to a default object on unbind. -*/ -template -class BindableWithDefault: protected Bindable -{ -protected: - BindableWithDefault() { } - -public: - static const T *current() - { - if(!Bindable::cur_obj) - Bindable::cur_obj = &default_object(); - return Bindable::cur_obj; - } - - static void unbind() - { - default_object().bind(); - } - - static const T &default_object() - { - static T obj; - return obj; - } -}; - - -/** -RAII class for binding things. Binds the thing upon construction and unbinds -it upon destruction. If a null pointer is given, unbinds upon construction and -does nothing upon destruction. -*/ -class Bind -{ -private: - typedef void CleanupFunc(); - - CleanupFunc *cleanup; - -public: - template - Bind(T *o) { init(o); } - - template - Bind(const T *o) { init(o); } - - template - Bind(const T &o) { init(&o); } - -private: - template - void init(const T *o) - { - cleanup = (o ? &unbind : 0); - if(o) - o->bind(); - else - T::unbind(); - } - -public: - ~Bind() - { if(cleanup) cleanup(); } - -private: - template - static void unbind() - { T::unbind(); } -}; - - -/** -Similar to Bind, but restores previous binding upon destruction. -*/ -class BindRestore -{ -private: - typedef void CleanupFunc(const void *); - - const void *old; - CleanupFunc *cleanup; - -public: - template - BindRestore(T *o) { init(o); } - - template - BindRestore(const T *o) { init(o); } - - template - BindRestore(const T &o) { init(&o); } - -private: - template - void init(T *o) - { - old = T::current(); - cleanup = (o!=old ? &restore : 0); - if(o) - o->bind(); - else if(old) - T::unbind(); - } - -public: - ~BindRestore() - { if(cleanup) cleanup(old); } - -private: - template - static void restore(const void *o) - { - if(o) - reinterpret_cast(o)->bind(); - else - T::unbind(); - } -}; - -} // namespace GL -} // namespace Msp - -#endif