segment_object_holder.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #ifndef DATASRC_MEMORY_SEGMENT_OBJECT_HOLDER_H
  15. #define DATASRC_MEMORY_SEGMENT_OBJECT_HOLDER_H 1
  16. #include <util/memory_segment.h>
  17. namespace isc {
  18. namespace datasrc {
  19. namespace memory {
  20. namespace detail {
  21. // A simple holder to create and use some objects in this implementation
  22. // in an exception safe manner. It works like std::auto_ptr but much
  23. // more simplified.
  24. // template parameter T is the type of object allocated by mem_sgmt.
  25. // template parameter ARG_T is the type that will be passed to destroy()
  26. // (deleter functor, etc). It must be copyable.
  27. template <typename T, typename ARG_T>
  28. class SegmentObjectHolder {
  29. public:
  30. SegmentObjectHolder(util::MemorySegment& mem_sgmt, T* obj, ARG_T arg) :
  31. mem_sgmt_(mem_sgmt), obj_(obj), arg_(arg)
  32. {}
  33. ~SegmentObjectHolder() {
  34. if (obj_ != NULL) {
  35. T::destroy(mem_sgmt_, obj_, arg_);
  36. }
  37. }
  38. T* get() { return (obj_); }
  39. T* release() {
  40. T* ret = obj_;
  41. obj_ = NULL;
  42. return (ret);
  43. }
  44. private:
  45. util::MemorySegment& mem_sgmt_;
  46. T* obj_;
  47. ARG_T arg_;
  48. };
  49. } // detail
  50. } // namespace memory
  51. } // namespace datasrc
  52. } // namespace isc
  53. #endif // DATASRC_MEMORY_SEGMENT_OBJECT_HOLDER_H
  54. // Local Variables:
  55. // mode: c++
  56. // End: