ladybird/Userland/Libraries/LibCore/AnonymousBuffer.h
Timothy Flynn ab99ed5fba LibIPC+Everywhere: Change IPC::encode's return type to ErrorOr
In doing so, this removes all uses of the Encoder's stream operator,
except for where it is currently still used in the generated IPC code.
So the stream operator currently discards any errors, which is the
existing behavior. A subsequent commit will propagate the errors.
2023-01-04 11:49:15 +01:00

84 lines
1.8 KiB
C++

/*
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2022, the SerenityOS developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Error.h>
#include <AK/Noncopyable.h>
#include <AK/RefCounted.h>
#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <LibIPC/Forward.h>
namespace Core {
class AnonymousBufferImpl final : public RefCounted<AnonymousBufferImpl> {
public:
static ErrorOr<NonnullRefPtr<AnonymousBufferImpl>> create(int fd, size_t);
~AnonymousBufferImpl();
int fd() const { return m_fd; }
size_t size() const { return m_size; }
void* data() { return m_data; }
void const* data() const { return m_data; }
private:
AnonymousBufferImpl(int fd, size_t, void*);
int m_fd { -1 };
size_t m_size { 0 };
void* m_data { nullptr };
};
class AnonymousBuffer {
public:
static ErrorOr<AnonymousBuffer> create_with_size(size_t);
static ErrorOr<AnonymousBuffer> create_from_anon_fd(int fd, size_t);
AnonymousBuffer() = default;
bool is_valid() const { return m_impl; }
int fd() const { return m_impl ? m_impl->fd() : -1; }
size_t size() const { return m_impl ? m_impl->size() : 0; }
template<typename T>
T* data()
{
static_assert(IsVoid<T> || IsTrivial<T>);
if (!m_impl)
return nullptr;
return (T*)m_impl->data();
}
template<typename T>
T const* data() const
{
static_assert(IsVoid<T> || IsTrivial<T>);
if (!m_impl)
return nullptr;
return (T const*)m_impl->data();
}
private:
explicit AnonymousBuffer(NonnullRefPtr<AnonymousBufferImpl>);
RefPtr<AnonymousBufferImpl> m_impl;
};
}
namespace IPC {
template<>
ErrorOr<void> encode(Encoder&, Core::AnonymousBuffer const&);
template<>
ErrorOr<Core::AnonymousBuffer> decode(Decoder&);
}