/src/libtomahawk/thirdparty/kdsingleapplicationguard/kdlockedsharedmemorypointer.h

http://github.com/tomahawk-player/tomahawk · C++ Header · 115 lines · 81 code · 32 blank · 2 comment · 1 complexity · 6260c9be14a5cd101e1b9f98cac51fa9 MD5 · raw file

  1. #ifndef __KDTOOLS__CORE__KDLOCKEDSHAREDMEMORYPOINTER_H__
  2. #define __KDTOOLS__CORE__KDLOCKEDSHAREDMEMORYPOINTER_H__
  3. #include <QtCore/QtGlobal>
  4. #if QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN )
  5. #ifndef QT_NO_SHAREDMEMORY
  6. #include "kdsharedmemorylocker.h"
  7. #include <QtCore/QSharedMemory>
  8. #include <cassert>
  9. #ifndef DOXYGEN_RUN
  10. namespace kdtools {
  11. #endif
  12. class KDLockedSharedMemoryPointerBase {
  13. protected:
  14. explicit KDLockedSharedMemoryPointerBase( QSharedMemory * mem );
  15. explicit KDLockedSharedMemoryPointerBase( QSharedMemory & mem );
  16. ~KDLockedSharedMemoryPointerBase();
  17. // PENDING(marc) do we really want const propagation here? I
  18. // usually declare all my RAII objects const...
  19. void * get();
  20. const void * get() const;
  21. KDAB_IMPLEMENT_SAFE_BOOL_OPERATOR( get() )
  22. size_t byteSize() const;
  23. private:
  24. KDSharedMemoryLocker locker;
  25. QSharedMemory * const mem;
  26. };
  27. template< typename T>
  28. class MAKEINCLUDES_EXPORT KDLockedSharedMemoryPointer : KDLockedSharedMemoryPointerBase {
  29. KDAB_DISABLE_COPY( KDLockedSharedMemoryPointer );
  30. public:
  31. explicit KDLockedSharedMemoryPointer( QSharedMemory * m )
  32. : KDLockedSharedMemoryPointerBase( m ) {}
  33. explicit KDLockedSharedMemoryPointer( QSharedMemory & m )
  34. : KDLockedSharedMemoryPointerBase( m ) {}
  35. T * get() { return static_cast<T*>( KDLockedSharedMemoryPointerBase::get() ); }
  36. const T * get() const { return static_cast<const T*>( KDLockedSharedMemoryPointerBase::get() ); }
  37. T * data() { return static_cast<T*>( get() ); }
  38. const T * data() const { return static_cast<const T*>( get() ); }
  39. T & operator*() { assert( get() ); return *get(); }
  40. const T & operator*() const { assert( get() ); return *get(); }
  41. T * operator->() { return get(); }
  42. const T * operator->() const { return get(); }
  43. KDAB_USING_SAFE_BOOL_OPERATOR( KDLockedSharedMemoryPointerBase )
  44. };
  45. template <typename T>
  46. class MAKEINCLUDES_EXPORT KDLockedSharedMemoryArray : KDLockedSharedMemoryPointerBase {
  47. KDAB_DISABLE_COPY( KDLockedSharedMemoryArray );
  48. public:
  49. explicit KDLockedSharedMemoryArray( QSharedMemory * m )
  50. : KDLockedSharedMemoryPointerBase( m ) {}
  51. explicit KDLockedSharedMemoryArray( QSharedMemory & m )
  52. : KDLockedSharedMemoryPointerBase( m ) {}
  53. typedef std::size_t size_type;
  54. typedef std::ptrdiff_t difference_type;
  55. typedef T* iterator;
  56. typedef const T* const_iterator;
  57. typedef std::reverse_iterator< const_iterator > const_reverse_iterator;
  58. typedef std::reverse_iterator< iterator > reverse_iterator;
  59. iterator begin() { return get(); }
  60. const_iterator begin() const { return get(); }
  61. iterator end() { return begin() + size(); }
  62. const_iterator end() const { return begin() + size(); }
  63. reverse_iterator rbegin() { return reverse_iterator( end() ); }
  64. const_reverse_iterator rbegin() const { return reverse_iterator( end() ); }
  65. reverse_iterator rend() { return reverse_iterator( begin() ); }
  66. const_reverse_iterator rend() const { return const_reverse_iterator( begin() ); }
  67. size_type size() const { return byteSize() / sizeof( T ); }
  68. T * get() { return static_cast<T*>( KDLockedSharedMemoryPointerBase::get() ); }
  69. const T * get() const { return static_cast<const T*>( KDLockedSharedMemoryPointerBase::get() ); }
  70. T & operator[]( difference_type n ) { assert( get() ); return *(get()+n); }
  71. const T & operator[]( difference_type n ) const { assert( get() ); return *(get()+n); }
  72. T & front() { assert( get() ); return *get(); }
  73. const T & front() const { assert( get() ); return *get(); }
  74. T & back() { assert( get() ); return *( get() + size() - 1 ); }
  75. const T & back() const { assert( get() ); return *( get() + size() - 1 ); }
  76. KDAB_USING_SAFE_BOOL_OPERATOR( KDLockedSharedMemoryPointerBase )
  77. };
  78. #ifndef DOXYGEN_RUN
  79. }
  80. #endif
  81. #endif /* QT_NO_SHAREDMEMORY */
  82. #endif /* QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN ) */
  83. #endif /* __KDTOOLS__CORE__KDLOCKEDSHAREDMEMORYPOINTER_H__ */