00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #pragma once
00013
00014 #include "nvsgcommon.h"
00015
00016 #include <vector>
00017
00018 namespace nvutil
00019 {
00020
00022 template<typename T>
00023 class MemFunTbl
00024 {
00025 typedef void (T::*PMFN) ();
00026 public:
00027 explicit MemFunTbl(size_t size);
00028 PMFN operator[](size_t i) const;
00029 template <typename U>
00030 void addEntry(size_t i, U pmfn);
00031 bool testEntry(size_t i) const;
00032 private:
00033 std::vector<PMFN> m_ftbl;
00034 };
00035
00036
00037
00038 template<typename T>
00039 inline MemFunTbl<T>::MemFunTbl(size_t size)
00040 {
00041 m_ftbl.resize(size, NULL);
00042 }
00043
00044 template<typename T>
00045 inline bool MemFunTbl<T>::testEntry(size_t i) const
00046 {
00047 return (i < m_ftbl.size()) && !!m_ftbl[i];
00048 }
00049
00050 template<typename T>
00051 inline typename MemFunTbl<T>::PMFN MemFunTbl<T>::operator[](size_t i) const
00052 {
00053 __ASSERT(testEntry(i));
00054 return m_ftbl[i];
00055 }
00056
00057 template<typename T>
00058 template<typename U>
00059 inline void MemFunTbl<T>::addEntry(size_t i, U pmfn)
00060 {
00061 if ( m_ftbl.size() <= i )
00062 {
00063 m_ftbl.resize(i+0x20, NULL);
00064 }
00065 m_ftbl[i]=*(PMFN*)&pmfn;
00066 }
00067
00068 }