mirror of
https://github.com/SerenityOS/serenity.git
synced 2026-11-07 12:38:38 -10:00
LibACPI: Add a failable way to clone an Object
This will be needed in the kernel.
This commit is contained in:
1 parent
3db136af6e
commit
ee1cf23dec
3 files changed
+51
No files matched your search
@@ -2,6 +2,7 @@ set(SOURCES
|
||||
Interpreter.cpp
|
||||
NameString.cpp
|
||||
Node.cpp
|
||||
Object.cpp
|
||||
OpcodeFilters.cpp
|
||||
OpcodeFrame.cpp
|
||||
Table.cpp
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (c) 2026, Undefine <[email protected]>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include "Object.h"
|
||||
|
||||
namespace ACPI::AML {
|
||||
|
||||
ErrorOr<String> String::clone() const
|
||||
{
|
||||
return String(TRY(m_buffer.clone()));
|
||||
}
|
||||
|
||||
ErrorOr<Buffer> Buffer::clone() const
|
||||
{
|
||||
return Buffer(TRY(m_buffer.clone()));
|
||||
}
|
||||
|
||||
ErrorOr<Package> Package::clone() const
|
||||
{
|
||||
Vector<Object> package;
|
||||
TRY(package.try_ensure_capacity(m_package.size()));
|
||||
for (auto const& object : m_package)
|
||||
package.unchecked_append(TRY(object.clone()));
|
||||
|
||||
return Package(move(package));
|
||||
}
|
||||
|
||||
ErrorOr<Object> Object::clone() const
|
||||
{
|
||||
return m_data.visit(
|
||||
[](AK::Empty) -> ErrorOr<Object> { return Object(); },
|
||||
[](u64 value) -> ErrorOr<Object> { return value; },
|
||||
[](String const& value) -> ErrorOr<Object> { return TRY(value.clone()); },
|
||||
[](Buffer const& value) -> ErrorOr<Object> { return TRY(value.clone()); },
|
||||
[](Package const& value) -> ErrorOr<Object> { return TRY(value.clone()); },
|
||||
[](NameString const& value) -> ErrorOr<Object> { return TRY(value.clone()); });
|
||||
}
|
||||
|
||||
}
|
||||
@@ -27,6 +27,8 @@ public:
|
||||
|
||||
ByteBuffer const& buffer() const { return m_buffer; }
|
||||
|
||||
ErrorOr<String> clone() const;
|
||||
|
||||
private:
|
||||
ByteBuffer m_buffer;
|
||||
};
|
||||
@@ -40,6 +42,8 @@ public:
|
||||
|
||||
ByteBuffer const& buffer() const { return m_buffer; }
|
||||
|
||||
ErrorOr<Buffer> clone() const;
|
||||
|
||||
private:
|
||||
ByteBuffer m_buffer;
|
||||
};
|
||||
@@ -53,6 +57,8 @@ public:
|
||||
|
||||
Vector<Object> const& package() const { return m_package; }
|
||||
|
||||
ErrorOr<Package> clone() const;
|
||||
|
||||
private:
|
||||
Vector<Object> m_package;
|
||||
};
|
||||
@@ -107,6 +113,8 @@ public:
|
||||
return Error::from_string_view_or_print_error_and_return_errno("Can not cast given type!"sv, EINVAL);
|
||||
}
|
||||
|
||||
ErrorOr<Object> clone() const;
|
||||
|
||||
protected:
|
||||
Variant<AK::Empty, u64, String, Buffer, Package, NameString> m_data;
|
||||
};
|
||||
|
||||
Reference in new issue
Block a user