10 #include "flutter/fml/macros.h"
18 class ArchiveClassRegistration;
19 class ArchiveStatement;
25 template <class T, class = std::enable_if_t<std::is_integral<T>::value>>
26 bool Write(
const std::string& member, T item) {
27 return WriteIntegral(member,
static_cast<int64_t
>(item));
30 bool Write(
const std::string& member,
double item);
32 bool Write(
const std::string& member,
const std::string& item);
37 class = std::enable_if_t<std::is_base_of<Archivable, T>::value>>
39 const ArchiveDef& otherDef = T::ArchiveDefinition;
40 return Write(member, otherDef, other);
43 template <class T, class = std::enable_if_t<std::is_enum<T>::value>>
44 bool WriteEnum(
const std::string& member,
const T& item) {
45 return WriteIntegral(member,
static_cast<int64_t
>(item));
49 class = std::enable_if_t<std::is_base_of<Archivable, T>::value>>
50 bool Write(
const std::string& member,
const std::vector<T>& items) {
54 std::vector<int64_t> members;
55 members.reserve(items.size());
57 const ArchiveDef& itemDefinition = T::kArchiveDefinition;
58 for (
const auto& item : items) {
59 auto row_id = context_.ArchiveInstance(itemDefinition, item);
60 if (!row_id.has_value()) {
63 members.emplace_back(row_id.value());
69 auto vectorInsert = WriteVectorKeys(std::move(members));
71 if (!vectorInsert.has_value()) {
75 return WriteIntegral(member, vectorInsert.value());
78 template <class T, class = std::enable_if_t<std::is_integral<T>::value>>
79 bool Read(
const std::string& member, T& item) {
81 auto result = ReadIntegral(member, decoded);
82 item =
static_cast<T
>(decoded);
86 bool Read(
const std::string& member,
double& item);
88 bool Read(
const std::string& member, std::string& item);
93 class = std::enable_if_t<std::is_base_of<Archivable, T>::value>>
95 const ArchiveDef& otherDef = T::ArchiveDefinition;
96 return decode(member, otherDef, other);
99 template <class T, class = std::enable_if_t<std::is_enum<T>::value>>
100 bool ReadEnum(
const std::string& member, T& item) {
101 int64_t desugared = 0;
102 if (ReadIntegral(member, desugared)) {
103 item =
static_cast<T
>(desugared);
110 class = std::enable_if_t<std::is_base_of<Archivable, T>::value>>
111 bool Read(
const std::string& member, std::vector<T>& items) {
115 int64_t vectorForeignKey = 0;
116 if (!ReadIntegral(member, vectorForeignKey)) {
123 std::vector<int64_t> keys;
124 if (!ReadVectorKeys(vectorForeignKey, keys)) {
128 const ArchiveDef& otherDef = T::kArchiveDefinition;
129 for (
const auto& key : keys) {
130 items.emplace_back();
132 if (!context_.UnarchiveInstance(otherDef, key, items.back())) {
153 bool WriteIntegral(
const std::string& member, int64_t item);
155 bool ReadIntegral(
const std::string& member, int64_t& item);
157 std::optional<int64_t> WriteVectorKeys(std::vector<int64_t>&& members);
159 bool ReadVectorKeys(
PrimaryKey name, std::vector<int64_t>& members);
161 bool Write(
const std::string& member,
165 bool Read(
const std::string& member,