/*s*************************************************************************** * * Copyright (c), Ilya Valuev 2006 All Rights Reserved. * * Author : Ilya Valuev, MIPT, Moscow, Russia * * Project : ivutils * *****************************************************************************/ /*s**************************************************************************** * $Log: refobj.h,v $ * Revision 1.2 2011/06/11 16:53:55 valuev * sync with LAMMPS * * Revision 1.1 2011/06/10 17:15:07 morozov * First Windows project with the correct directory structure * * Revision 1.15 2010/10/07 11:20:31 valuev * preliminary program restart * * Revision 1.14 2009/07/24 05:08:46 valuev * Sync with FDTD, added molecule setup * * Revision 1.33 2009/05/19 21:50:17 valuev * Added TestRay for plane * * Revision 1.32 2009/03/23 22:00:48 lesha * const mngptr &operator=(const mngarg &arg) is added * * Revision 1.31 2009/01/30 13:54:05 valuev * restructured as a library * * Revision 1.30 2009/01/21 09:28:15 lesha * refvector::clear is added * * Revision 1.29 2009/01/15 07:31:07 lesha * *** empty log message *** * * Revision 1.28 2009/01/14 10:02:36 lesha * operator [] is added to mngptr * * Revision 1.27 2008/04/29 01:23:59 lesha * nothing important * * Revision 1.26 2008/02/28 08:57:27 lesha * shptr::free() is made public * * Revision 1.25 2008/02/27 13:37:23 lesha * shptr is added * * Revision 1.24 2008/01/22 10:14:05 lesha * mngarg is added * * Revision 1.23 2007/08/08 10:55:37 lesha * constructor in refvector is correted * * Revision 1.22 2007/07/10 19:52:44 lesha * make gcc compilable * * Revision 1.21 2007/07/06 12:23:37 valuev * made compilable with icc 9 * * Revision 1.20 2007/06/22 09:42:25 valuev * *** empty log message *** * * Revision 1.19 2007/06/17 00:51:44 lesha * refobj, refcounter :: reset is modified for ptr==this->ptr case * * Revision 1.18 2007/06/05 16:30:53 lesha * make gcc compilable * * Revision 1.17 2007/06/05 11:37:53 lesha * make gcc compilable * * Revision 1.16 2007/06/05 11:07:04 lesha * make gcc compilable * * Revision 1.15 2007/06/04 14:03:55 lesha * *** empty log message *** * * Revision 1.14 2007/05/31 18:00:42 lesha * *** empty log message *** * * Revision 1.13 2007/05/31 16:57:30 lesha * ref_sequence is added * * Revision 1.12 2007/05/31 01:25:01 lesha * new version of mng_ptr, pencil etc * * Revision 1.11 2007/02/20 10:26:11 valuev * added newlines at end of file * * Revision 1.10 2007/02/16 10:16:51 valuev * allowed array mngptr * * Revision 1.4 2007/02/16 09:40:32 valuev * Added Nudged Elastic Band saddle point search * * Revision 1.3 2006/12/20 14:29:33 valuev * Updated workflow, sync with FDTD * * Revision 1.9 2006/12/14 08:42:36 valuev * reformulated detector * projectors, corrected open file limit control, tested Fourier sceleton * * Revision 1.8 2006/11/29 18:05:05 valuev * made the code compilable with g++ * * Revision 1.7 2006/11/29 17:17:01 valuev * added using base_t::member for ANSI-compatibility * * Revision 1.6 2006/11/29 17:11:59 valuev * added includes * * Revision 1.5 2006/11/28 09:16:59 valuev * Fixed vectors storing managed pointers * * Revision 1.4 2006/11/24 20:17:31 valuev * Added CVS headers * *******************************************************************************/ #ifndef _REFOBJ_H #define _REFOBJ_H # include # include # include using namespace std; template class mngarg: public pair{ public: typedef pair base_t; using base_t::second; using base_t::first; mngarg(T *ptr, int managed=0): pair(ptr,managed){} template mngarg(const mngarg &arg): pair(arg.first,arg.second){} }; template mngarg make_mngarg(T *ptr, int managed=1){ return mngarg(ptr,managed); } /// managed pointer /// managed==0 do not delete /// managed==1 delete /// (NOT IMPLEMENTED) managed==2 copy and delete, requires copy constructor /// flag 0x8 -- delete as array template class mngptr: public pair{ public: typedef pair base_t; typedef T *pointer; using base_t::second; using base_t::first; mngptr(T* ptr=NULL, int managed=0): pair(ptr,managed){ //if(managed==2)ptr= new T(*ptr); } mngptr(const mngarg &arg): pair(arg.first,arg.second){} const mngptr &operator=(const mngarg &arg){ reset(arg.first,arg.second); return *this; } void reset(T* ptr=NULL, int managed=0){ if(second && first && first!=ptr){ if(second&0x8)delete [] first; else delete first; } first=ptr; second=managed; } void reset(const mngarg &arg){ reset(arg.first,arg.second); } T* ptr() const { return first; } T* operator->() const { return first; } T& operator*() const{ return *first; } T& operator[] (int i) const{ return *(first+i); } int managed() const { return second; } ~mngptr(){ reset(); } }; # if 0 template class cont_tt, class T> class refcontainer: public cont_tt< T * >{ protected: int man; public: typedef cont_tt< T * > base_t; typedef typename base_t::iterator iterator; typedef typename base_t::const_iterator const_iterator; refcontainer(int smanaged=0):man(smanaged){} refcontainer(size_t n, int smanaged=0):base_t(n),man(smanaged){} void set_managed(int sman){ man=sman; } ~refcontainer(){ if(man){ size_t i, n=base_t::size(); for(i=0;i class refvector: public std::vector< T * >{ protected: int man; public: typedef vector base_t; typedef typename base_t::iterator iterator; typedef typename base_t::const_iterator const_iterator; refvector(int smanaged=0):man(smanaged){} // refvector(size_t n, int smanaged=0):base_t(n),man(smanaged){} // ambigious constructors refvector(size_t n, int smanaged):base_t(n),man(smanaged){} void set_managed(int sman){ man=sman; } ~refvector(){ clear(); } void clear() { if(man){ iterator it=base_t::begin(); for(;it!=base_t::end();++it) if(*it) delete (*it); } base_t::clear(); } iterator erase(iterator it){ if(man && *it) delete (*it); return base_t::erase(it); } }; template class refmap: public std::map{ protected: int man; public: typedef std::map base_t; typedef typename base_t::iterator iterator; typedef typename base_t::const_iterator const_iterator; refmap(int smanaged=0):man(smanaged){} refmap(size_t n, int smanaged=0):base_t(n),man(smanaged){} void set_managed(int sman){ man=sman; } ~refmap(){ clear(); } void clear() { if(man){ for(typename base_t::iterator i=base_t::begin();i!=base_t::end();++i) if(i->second) delete i->second; } base_t::clear(); } iterator erase(iterator it){ if(man && it->second) delete it->second; return base_t::erase(it); } }; template class delete_ptr{ public: void operator()(T *ptr){ delete ptr; } }; template > class shptr{ template friend class shptr; T *p; int *num; //if num==NULL than p is not managed (as in mngptr) void set(T *p_, int managed){ p=p_; if(p&&managed){ num=new int; *num=1; } else num=NULL; } template void set(const Y &other){ p=other.p; if(p){ num=other.num; if(num)(*num)++; } else num=NULL; } void set(const shptr &other){ p=other.p; if(p){ num=other.num; if(num)(*num)++; } else num=NULL; } public: shptr(T* p=NULL, int managed=1){ set(p,managed); } shptr(const mngarg &arg){ set(arg.first,arg.second); } template shptr(const Y &other){ set(other); } shptr(const shptr &other){ set(other); } void reset(T *p_, int managed=1) { if(p!=p_){ free(); set(p_,managed); } } void reset(const shptr &other) { if(this!=&other){ free(); set(other); } } const shptr &operator=(T *p) { reset(p,0); return *this; } const shptr &operator=(const mngarg &arg) { reset(arg.first,arg.second); return *this; } template const shptr &operator=(const Y &other){ reset(other); return *this; } const shptr &operator=(const shptr &other) { reset(other); return *this; } virtual ~shptr(){ free(); } void free(){ if(p){ if(num){ (*num)--; if((*num)==0){ delete_t()(p); delete num; } num=NULL; } p=NULL; } } bool valid() const { return p!=NULL; } T* ptr() const { return p; } T* operator->() const { return p; } T& operator*() const{ return *p; } }; /* class RefObject{ void *ref_data; int ref_count; public: protected: virtual void delete_data(void *data); virtual void *new_data(); virtual void *copy_data(void *data); } class RefA: public RefObject{ public: refA(){ ref_data = new A; } refA(const refA &other){ Ref(other); } refA& operator=(const refA &other){ if(ref_data != other.ref_data){ Ref(other); } return *this; } private: void delete_data(void *data){ delete (A *)data; } void *new_data(){ return (void *)new A; } void *copy_data(void *data){ return (void *)(new A(*((A*)data))); } }*/ #endif