AnonymousBuffer.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*
  2. * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Noncopyable.h>
  8. #include <AK/RefCounted.h>
  9. #include <AK/RefPtr.h>
  10. #include <AK/Types.h>
  11. #include <LibIPC/Forward.h>
  12. namespace Core {
  13. class AnonymousBufferImpl final : public RefCounted<AnonymousBufferImpl> {
  14. public:
  15. static RefPtr<AnonymousBufferImpl> create(int fd, size_t);
  16. ~AnonymousBufferImpl();
  17. int fd() const { return m_fd; }
  18. size_t size() const { return m_size; }
  19. void* data() { return m_data; }
  20. const void* data() const { return m_data; }
  21. private:
  22. AnonymousBufferImpl(int fd, size_t, void*);
  23. int m_fd { -1 };
  24. size_t m_size { 0 };
  25. void* m_data { nullptr };
  26. };
  27. class AnonymousBuffer {
  28. public:
  29. static AnonymousBuffer create_with_size(size_t);
  30. static AnonymousBuffer create_from_anon_fd(int fd, size_t);
  31. AnonymousBuffer() { }
  32. ~AnonymousBuffer();
  33. bool is_valid() const { return m_impl; }
  34. int fd() const { return m_impl ? m_impl->fd() : -1; }
  35. size_t size() const { return m_impl ? m_impl->size() : 0; }
  36. template<typename T>
  37. T* data()
  38. {
  39. static_assert(IsVoid<T> || IsTrivial<T>);
  40. if (!m_impl)
  41. return nullptr;
  42. return (T*)m_impl->data();
  43. }
  44. template<typename T>
  45. const T* data() const
  46. {
  47. static_assert(IsVoid<T> || IsTrivial<T>);
  48. if (!m_impl)
  49. return nullptr;
  50. return (const T*)m_impl->data();
  51. }
  52. private:
  53. explicit AnonymousBuffer(NonnullRefPtr<AnonymousBufferImpl>);
  54. RefPtr<AnonymousBufferImpl> m_impl;
  55. };
  56. }
  57. namespace IPC {
  58. bool encode(Encoder&, const Core::AnonymousBuffer&);
  59. bool decode(Decoder&, Core::AnonymousBuffer&);
  60. }