AnonymousBuffer.h 1.8 KB

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