MOOSE - Multiscale Object Oriented Simulation Environment
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Dinfo.h
Go to the documentation of this file.
1 /**********************************************************************
2 ** This program is part of 'MOOSE', the
3 ** Messaging Object Oriented Simulation Environment.
4 ** Copyright (C) 2003-2009 Upinder S. Bhalla. and NCBS
5 ** It is made available under the terms of the
6 ** GNU Lesser General Public License version 2.1
7 ** See the file COPYING.LIB for the full notice.
8 **********************************************************************/
9 #ifndef _DINFO_H
10 #define _DINFO_H
11 
12 class DinfoBase
13 {
14  public:
16  : isOneZombie_( 0 )
17  {;}
19  : isOneZombie_( isOneZombie )
20  {;}
21  virtual ~DinfoBase()
22  {;}
23  virtual char* allocData( unsigned int numData ) const = 0;
24  virtual void destroyData( char* d ) const = 0;
25  virtual unsigned int size() const = 0;
26  virtual unsigned int sizeIncrement() const = 0;
27 
34  virtual char* copyData( const char* orig, unsigned int origEntries,
35  unsigned int copyEntries, unsigned int startEntry ) const = 0;
36 
43  virtual void assignData( char* copy, unsigned int copyEntries,
44  const char* orig, unsigned int origEntries ) const = 0;
45 
46  /*
47  static unsigned int size( const D* value ) const = 0;
48  static unsigned int serialize( char* buf, const Data* d ) const = 0;
49  static unsigned int unserialize( const char* buf, Data* d ) const = 0;
50  */
51  virtual bool isA( const DinfoBase* other ) const = 0;
52 
53  bool isOneZombie() const {
54  return isOneZombie_;
55  }
56  private:
57  const bool isOneZombie_;
58 };
59 
60 template< class D > class Dinfo: public DinfoBase
61 {
62  public:
64  : sizeIncrement_( sizeof( D ) )
65  {;}
67  : DinfoBase( isOneZombie ),
68  sizeIncrement_( isOneZombie ? 0 : sizeof( D ) )
69  {;}
70 
71  char* allocData( unsigned int numData ) const {
72  if ( numData == 0 )
73  return 0;
74  else
75  return reinterpret_cast< char* >( new( nothrow) D[ numData ] );
76  }
77 
78  char* copyData( const char* orig, unsigned int origEntries,
79  unsigned int copyEntries, unsigned int startEntry ) const
80  {
81  if ( origEntries == 0 )
82  return 0;
83  if ( isOneZombie() )
84  copyEntries = 1;
85 
86  D* ret = new( nothrow ) D[copyEntries];
87  if ( !ret )
88  return 0;
89  const D* origData = reinterpret_cast< const D* >( orig );
90  for ( unsigned int i = 0; i < copyEntries; ++i ) {
91  ret[ i ] = origData[ ( i + startEntry ) % origEntries ];
92  }
93 
94  /*
95  D* ret = new D[ numData * numCopies ];
96  const D* origData = reinterpret_cast< const D* >( orig );
97  for ( unsigned int i = 0; i < numData; ++i ) {
98  for ( unsigned int j = 0; j < numCopies; ++j ) {
99  ret[ i * numCopies + j ] = origData[ i ];
100  }
101  }
102  */
103  return reinterpret_cast< char* >( ret );
104  }
105 
106  void assignData( char* data, unsigned int copyEntries,
107  const char* orig, unsigned int origEntries ) const
108  {
109  if ( origEntries == 0 || copyEntries == 0 ||
110  orig == 0 || data == 0 ) {
111  return;
112  }
113  if ( isOneZombie() )
114  copyEntries = 1;
115  const D* origData = reinterpret_cast< const D* >( orig );
116  D* tgt = reinterpret_cast< D* >( data );
117  for ( unsigned int i = 0; i < copyEntries; ++i ) {
118  tgt[ i ] = origData[ i % origEntries ];
119  }
120 
121  /*
122  for ( unsigned int i = 0; i < copyEntries; i+= origEntries ) {
123  unsigned int numCopies = origEntries;
124  if ( copyEntries - i < origEntries )
125  numCopies = copyEntries - i;
126  for ( unsigned int j = 0; j < numCopies; ++j ) {
127  tgt[i +j] = origData[j];
128  }
129  // memcpy( data + i * sizeof( D ), orig, sizeof( D ) * numCopies );
130  // Memcpy is fast but it does not permit for C++ to do
131  // various constructor and assignment operations that are
132  // important if D has pointers in it.
133  }
134  */
135  }
136 
137  void destroyData( char* d ) const {
138  delete[] reinterpret_cast< D* >( d );
139  }
140 
141  unsigned int size() const {
142  return sizeof( D );
143  }
144 
151  unsigned int sizeIncrement() const {
152  return sizeIncrement_;
153  }
154 
155  /*
156  // Will need to specialize for variable size and pointer-containing
157  // D.
158  static unsigned int serialize( char* buf, const Data* d ) {
159  *reinterpret_cast< D* >( buf ) = *static_cast< const D* >( d );
160  return sizeof( D );
161  }
162 
163  static unsigned int unserialize( const char* buf, Data* d ) {
164  *d = *reinterpret_cast< const D* >( buf );
165  return sizeof( D );
166  }
167  // Possible problems of dependence here.
168  // static const Cinfo* cinfo;
169  */
170  bool isA( const DinfoBase* other ) const {
171  return dynamic_cast< const Dinfo< D >* >( other );
172  }
173  private:
174  unsigned int sizeIncrement_;
175 };
176 
177 template< class D > class ZeroSizeDinfo: public Dinfo< D >
178 {
179  public:
180  unsigned int size() const {
181  return 0;
182  }
183  unsigned int sizeIncrement() const {
184  return 0;
185  }
186 };
187 
188 #endif // _DINFO_H
virtual bool isA(const DinfoBase *other) const =0
const bool isOneZombie_
Definition: Dinfo.h:57
Definition: Dinfo.h:60
virtual unsigned int size() const =0
virtual void destroyData(char *d) const =0
unsigned int size() const
Definition: Dinfo.h:180
DinfoBase(bool isOneZombie)
Definition: Dinfo.h:18
unsigned int sizeIncrement_
Definition: Dinfo.h:174
virtual char * copyData(const char *orig, unsigned int origEntries, unsigned int copyEntries, unsigned int startEntry) const =0
char * allocData(unsigned int numData) const
Definition: Dinfo.h:71
unsigned int size() const
Definition: Dinfo.h:141
virtual unsigned int sizeIncrement() const =0
unsigned int sizeIncrement() const
Definition: Dinfo.h:151
void assignData(char *data, unsigned int copyEntries, const char *orig, unsigned int origEntries) const
Definition: Dinfo.h:106
unsigned int sizeIncrement() const
Definition: Dinfo.h:183
char * copyData(const char *orig, unsigned int origEntries, unsigned int copyEntries, unsigned int startEntry) const
Definition: Dinfo.h:78
bool isOneZombie() const
Definition: Dinfo.h:53
virtual void assignData(char *copy, unsigned int copyEntries, const char *orig, unsigned int origEntries) const =0
virtual char * allocData(unsigned int numData) const =0
void destroyData(char *d) const
Definition: Dinfo.h:137
virtual ~DinfoBase()
Definition: Dinfo.h:21
DinfoBase()
Definition: Dinfo.h:15
bool isA(const DinfoBase *other) const
Definition: Dinfo.h:170
Dinfo(bool isOneZombie)
Definition: Dinfo.h:66
Dinfo()
Definition: Dinfo.h:63