1 #ifndef _RHEO_SMART_POINTER_H
2 #define _RHEO_SMART_POINTER_H
123 #include "rheolef/compiler.h"
130 template <
class T,
class C>
147 const T&
data ()
const;
165 #pragma GCC diagnostic push
166 #pragma GCC diagnostic ignored "-Weffc++"
169 #pragma GCC diagnostic pop
171 counter (
const counter&);
184 template <
class T,
class C>
186 smart_pointer_base<T,C>::counter::counter (
T*
p)
190 template <
class T,
class C>
192 smart_pointer_base<T,C>::counter::~counter ()
196 #pragma GCC diagnostic push
197 #pragma GCC diagnostic ignored "-Weffc++"
198 template <
class T,
class C>
201 smart_pointer_base<T,C>::counter::operator++ ()
205 template <
class T,
class C>
208 smart_pointer_base<T,C>::counter::operator-- ()
210 if (--_n != 0)
return _n;
214 #pragma GCC diagnostic pop
218 template <
class T,
class C>
221 : _count(new_macro(counter(
p)))
224 template <
class T,
class C>
227 : _count(static_cast<counter*>(count))
231 template <
class T,
class C>
238 template <
class T,
class C>
242 if (_count != 0) { --(*_count); }
244 template <
class T,
class C>
249 if (_count != sp._count) {
256 template <
class T,
class C>
263 template <
class T,
class C>
270 template <
class T,
class C>
277 template <
class T,
class C>
284 template <
class T,
class C>
290 if (_count -> _p == 0)
return 0;
291 if (_count -> _n > 1) {
293 T* q = C()(*(_count -> _p));
294 _count = new_macro (counter(q));
298 template <
class T,
class C>
305 template <
class T,
class C>
312 template <
class T,
class C>
325 template <
typename T>
327 T* operator() (
const T& data)
throw() {
return new_macro(
T(data)); }
331 template <
typename T>
333 T* operator() (
const T& from)
throw() {
return from.clone(); }
337 template <
typename T>
339 T* operator() (
const T& from) {
340 error_macro (
"no_copy functor called (illegal copy)");
350 template <
typename T>
361 base::operator= (x);
return *
this; }
369 template <
typename T>
380 base::operator= (x);
return *
this; }
388 template <
typename T>
399 base::operator= (x);
return *
this; }
404 #endif // _RHEO_SMART_POINTER_H
406 #ifdef _RHEO_SMART_POINTER_TST_CC
416 class container_data {
426 container_data (
const container_data& x)
427 : values(new
T[x.
n]),
n(x.
n)
428 {
for (
int i=0; i<
n;i++) values[i]=x.values[i];}
429 container_data& operator= (
const container_data& x) {
432 for (
int i=0; i<
n;i++) values[i]=x.values[i];
436 explicit container_data(
int n1)
437 : values(new
T[n1]),
n(n1) {}
439 ~container_data() {
delete [] values; }
442 const T& operator[](
int i)
const
443 {
return values[i]; }
445 {
return values[i]; }
453 explicit container(
int n = 0);
456 const T& operator[](
int i)
const;
457 T& operator[](
int i);
462 container::container (
int n)
466 container::operator[] (
int i)
const {
468 return data().operator[] (i);
471 container::operator[] (
int i) {
473 return data().operator [] (i);
482 std::cerr <<
"fatal: It is not a true copy semantic." << std::endl;
485 std::cerr <<
"It seems to be a true copy semantic." << std::endl;
488 #endif // _RHEO_SMART_POINTER_TST_CC