version that should work with synamic linked libraries (to be tested)

This commit is contained in:
ganovelli 2010-06-21 15:52:18 +00:00
parent 9026213628
commit ad0a3daf01
1 changed files with 34 additions and 5 deletions

View File

@ -26,14 +26,20 @@
#define __VCGLIB_CAT__ #define __VCGLIB_CAT__
#include <vector> #include <vector>
#include <map>
#include <string>
#include <list> #include <list>
#include <algorithm> #include <algorithm>
#include <assert.h> #include <assert.h>
#include <vcg/container/entries_allocation_table.h> #include <vcg/container/entries_allocation_table.h>
namespace vcg { namespace vcg {
/*@{*/ /*@{*/
/*! /*!
* CATBase is the abstract class for all the allocation tables. These table keep track of * CATBase is the abstract class for all the allocation tables. These table keep track of
* where the traced vector (see traced_ector.h) are kept in memory. * where the traced vector (see traced_ector.h) are kept in memory.
@ -42,8 +48,14 @@ namespace vcg {
* *
*/ */
struct CATBaseBase{
};
template <typename STL_CONT> template <typename STL_CONT>
class CATBase{ class CATBase: public CATBaseBase{
public: public:
typedef typename STL_CONT::value_type ValueType; typedef typename STL_CONT::value_type ValueType;
@ -304,17 +316,34 @@ ATTR_TYPE & CAT<STL_CONT,ATTR_TYPE>::
Get(const ValueType * pt) Get(const ValueType * pt)
{ {
int ord = Ord(pt); int ord = Ord(pt);
//int ord = pt- &(* ((*AT().begin()).C()->begin())); se AT() contiene un solo elemento funziona anche cos
return TT::Curr()->Data()[ord]; return TT::Curr()->Data()[ord];
} }
struct Env{
static std::map< std::string,CATBaseBase *> & TypeNameBounds(){
static std::map< std::string,CATBaseBase *> ntb; return ntb;}
template <class TYPE_1,class TYPE_2>
static CAT<TYPE_1,TYPE_2> * newCAT(){
std::string n = std::string(typeid(TYPE_1).name())+std::string(typeid(TYPE_2).name());
std::map< std::string,CATBaseBase *>::iterator ti = TypeNameBounds().find(n);
if(ti == TypeNameBounds().end()){
CAT<TYPE_1,TYPE_2> * res = new CAT<TYPE_1,TYPE_2>();
TypeNameBounds().insert(std::pair<std::string,CATBaseBase*>(n,res));
return res;
}
else (CAT<TYPE_1,TYPE_2> *) (*ti).second;
}
};
template <typename STL_CONT, class ATTR_TYPE> template <typename STL_CONT, class ATTR_TYPE>
CAT<STL_CONT,ATTR_TYPE> * CAT<STL_CONT,ATTR_TYPE>:: CAT<STL_CONT,ATTR_TYPE> * CAT<STL_CONT,ATTR_TYPE>::
New(){ New(){
if(Instance()==NULL) if(Instance()==NULL)
{ {
Instance() = new CAT<STL_CONT,ATTR_TYPE>(); // Instance() = new CAT<STL_CONT,ATTR_TYPE>();
Instance() = Env::newCAT<STL_CONT,ATTR_TYPE>();
} }
return Instance(); return Instance();
} }