Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

MemFunTbl.h

00001 // Copyright NVIDIA Corporation 2002-2004
00002 // TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
00003 // *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
00004 // OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
00005 // AND FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS
00006 // BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES
00007 // WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS,
00008 // BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS)
00009 // ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF NVIDIA HAS
00010 // BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES 
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 // inline implementations can go here
00037 
00038 template<typename T>
00039 inline MemFunTbl<T>::MemFunTbl(size_t size)
00040 { // table entries to avoid frequent allocations at addEntry
00041   m_ftbl.resize(size, NULL); 
00042 }
00043 
00044 template<typename T>
00045 inline bool MemFunTbl<T>::testEntry(size_t i) const
00046 { // test if entry at i is a valid entry
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 { // read-only access to function pointer stored at index i
00053   __ASSERT(testEntry(i)); // undefined behavior for invalid entries
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 { // register function pointer
00061   if ( m_ftbl.size() <= i )
00062   { // add 32 table entries
00063     m_ftbl.resize(i+0x20, NULL); 
00064   }
00065   m_ftbl[i]=*(PMFN*)&pmfn;
00066 }
00067 
00068 } // end of namespace nvutil scope

Generated on Tue Mar 1 13:19:20 2005 for NVSGSDK by NVIDIA