scoped_ptr.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //
  2. // CRF++ -- Yet Another CRF toolkit
  3. //
  4. // $Id: scoped_ptr.h 1588 2007-02-12 09:03:39Z taku $;
  5. //
  6. // Copyright(C) 2005-2007 Taku Kudo <taku@chasen.org>
  7. //
  8. #ifndef CRFPP_SCOPED_PTR_H__
  9. #define CRFPP_SCOPED_PTR_H__
  10. #include <cstring>
  11. #include <string>
  12. namespace CRFPP {
  13. template <class T>
  14. class scoped_ptr {
  15. private:
  16. T *ptr_;
  17. scoped_ptr(scoped_ptr const &);
  18. scoped_ptr &operator=(scoped_ptr const &);
  19. typedef scoped_ptr<T> this_type;
  20. public:
  21. typedef T element_type;
  22. explicit scoped_ptr(T *p = 0) : ptr_(p) {}
  23. virtual ~scoped_ptr() { delete ptr_; }
  24. void reset(T *p = 0) {
  25. delete ptr_;
  26. ptr_ = p;
  27. }
  28. T &operator*() const { return *ptr_; }
  29. T *operator->() const { return ptr_; }
  30. T *get() const { return ptr_; }
  31. };
  32. template <class T>
  33. class scoped_array {
  34. private:
  35. T *ptr_;
  36. scoped_array(scoped_array const &);
  37. scoped_array &operator=(scoped_array const &);
  38. typedef scoped_array<T> this_type;
  39. public:
  40. typedef T element_type;
  41. explicit scoped_array(T *p = 0) : ptr_(p) {}
  42. virtual ~scoped_array() { delete[] ptr_; }
  43. void reset(T *p = 0) {
  44. delete[] ptr_;
  45. ptr_ = p;
  46. }
  47. T &operator*() const { return *ptr_; }
  48. T *operator->() const { return ptr_; }
  49. T *get() const { return ptr_; }
  50. T &operator[](size_t i) const { return ptr_[i]; }
  51. };
  52. class scoped_string : public scoped_array<char> {
  53. public:
  54. explicit scoped_string() { reset_string(""); }
  55. explicit scoped_string(const std::string &str) { reset_string(str); }
  56. void reset_string(const std::string &str) {
  57. char *p = new char[str.size() + 1];
  58. strcpy(p, str.c_str());
  59. reset(p);
  60. }
  61. void reset_string(const char *str) {
  62. char *p = new char[strlen(str) + 1];
  63. strcpy(p, str);
  64. reset(p);
  65. }
  66. };
  67. }
  68. #endif