AnonymousBuffer.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. bool is_valid() const { return m_impl; }
  33. int fd() const { return m_impl ? m_impl->fd() : -1; }
  34. size_t size() const { return m_impl ? m_impl->size() : 0; }
  35. template<typename T>
  36. T* data()
  37. {
  38. static_assert(IsVoid<T> || IsTrivial<T>);
  39. if (!m_impl)
  40. return nullptr;
  41. return (T*)m_impl->data();
  42. }
  43. template<typename T>
  44. const T* data() const
  45. {
  46. static_assert(IsVoid<T> || IsTrivial<T>);
  47. if (!m_impl)
  48. return nullptr;
  49. return (const T*)m_impl->data();
  50. }
  51. private:
  52. explicit AnonymousBuffer(NonnullRefPtr<AnonymousBufferImpl>);
  53. RefPtr<AnonymousBufferImpl> m_impl;
  54. };
  55. }
  56. namespace IPC {
  57. bool encode(Encoder&, const Core::AnonymousBuffer&);
  58. bool decode(Decoder&, Core::AnonymousBuffer&);
  59. }