Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef TCG_DELETER_TYPES_H
Toshihiro Shimizu 890ddd
#define TCG_DELETER_TYPES_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// tcg includes
Toshihiro Shimizu 890ddd
#include "traits.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
  \file     deleter_types.h
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \brief    This file contains implementations of some useful deleter functors
Toshihiro Shimizu 890ddd
            and deleter concepts.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace tcg {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*********************************************************************************
Toshihiro Shimizu 890ddd
//    Deleter  objects
Toshihiro Shimizu 890ddd
//*********************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename t=""></typename>
Toshihiro Shimizu 890ddd
struct deleter {
Shinya Kitaoka 120a6e
  void operator()(T *ptr) const { delete ptr; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename t=""></typename>
Toshihiro Shimizu 890ddd
struct deleter<t[]> {</t[]>
Shinya Kitaoka 120a6e
  void operator()(T *ptr) const { delete[] ptr; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename t=""></typename>
Toshihiro Shimizu 890ddd
struct dtor {
Shinya Kitaoka 120a6e
  void operator()(T *ptr) const { ptr->~T(); }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename t=""></typename>
Toshihiro Shimizu 890ddd
struct dtor<t[]> {</t[]>
Shinya Kitaoka 120a6e
  int m_count;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  dtor(int count) : m_count(count) {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void operator()(T *ptr) const {
Shinya Kitaoka 120a6e
    for (int t = 0; t != m_count; ++t) ptr[t].~T();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
struct freer {
Shinya Kitaoka 120a6e
  void operator()(void *ptr) const { free(ptr); }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  The Deleter concept can be used to destroy instances of incomplete types.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  Deleter objects are useful in all cases where a type-erasure concept needs
Toshihiro Shimizu 890ddd
  to support specialization on incomplete types.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename t=""></typename>
Shinya Kitaoka 120a6e
class deleter_concept {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  typedef typename tcg::traits<t>::pointer_type pointer_type;</t>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  virtual ~deleter_concept() {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  virtual deleter_concept *clone() const    = 0;
Shinya Kitaoka 120a6e
  virtual void operator()(pointer_type ptr) = 0;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename t=""></typename>
Shinya Kitaoka 120a6e
class deleter_model : public deleter_concept<t> {</t>
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  deleter_concept<t> *clone() const { return new deleter_model<t>(*this); }</t></t>
Shinya Kitaoka 120a6e
  void operator()(T *ptr) { delete ptr; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename t=""></typename>
Shinya Kitaoka 120a6e
class deleter_model<t[]> : public deleter_concept<t[]> {</t[]></t[]>
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  deleter_concept<t[]> *clone() const { return new deleter_model<t[]>(*this); }</t[]></t[]>
Shinya Kitaoka 120a6e
  void operator()(T *ptr) { delete[] ptr; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
}  // namespace tcg
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // TCG_DELETER_TYPES_H