client: consolidate cache_sync()

This commit is contained in:
Michael Davidsaver
2023-09-25 18:50:26 -07:00
parent 304fc9b8a6
commit 8acd4fa5ea
3 changed files with 55 additions and 41 deletions
+1 -41
View File
@@ -547,47 +547,7 @@ void Connection::handle_MONITOR()
}
from_wire_valid(M, rxRegistry, data);
/* co-iterate data and prototype.
* copy marked from data -> prototype
* copy unmarked from prototype -> data
*/
{
auto desc = Value::Helper::desc(info->prototype);
auto delta = Value::Helper::store_ptr(data);
auto complete = Value::Helper::store_ptr(info->prototype);
auto N = desc->size();
for(size_t i=0u; i < N; i++, delta++, complete++)
{
const auto src = delta->valid ? delta : complete;
auto dst = delta->valid ? complete : delta;
switch(delta->code) {
case StoreType::Null:
break;
case StoreType::Bool:
case StoreType::UInteger:
case StoreType::Integer:
case StoreType::Real:
memcpy(&dst->store, &src->store, sizeof(src->store));
break;
case StoreType::String:
dst->as<std::string>() = src->as<std::string>();
break;
case StoreType::Array:
dst->as<shared_array<const void>>() = src->as<shared_array<const void>>();
break;
case StoreType::Compound:
{
std::shared_ptr<impl::FieldStorage> sstore(Value::Helper::store(data),
src);
auto& dfld(dst->as<Value>());
Value::Helper::set_desc(dfld, &desc[i]);
Value::Helper::store(dfld) = std::move(sstore);
}
break;
}
}
}
cache_sync(info->prototype, data);
BitMask overrun;
from_wire(M, overrun);
+46
View File
@@ -1184,6 +1184,52 @@ Value::_Iterator<Value::_IMarked>::operator++() noexcept
return *this;
}
void cache_sync(Value& cache, Value& dlt)
{
if(!cache.equalType(dlt))
throw std::logic_error(SB()<<__func__<<" requires matching types");
/* co-iterate data and prototype.
* copy marked from data -> prototype
* copy unmarked from prototype -> data
*/
auto desc = Value::Helper::desc(cache);
auto delta = Value::Helper::store_ptr(dlt);
auto complete = Value::Helper::store_ptr(cache);
auto N = desc->size();
for(size_t i=0u; i < N; i++, delta++, complete++)
{
const auto src = delta->valid ? delta : complete;
auto dst = delta->valid ? complete : delta;
switch(delta->code) {
case StoreType::Null:
break;
case StoreType::Bool:
case StoreType::UInteger:
case StoreType::Integer:
case StoreType::Real:
memcpy(&dst->store, &src->store, sizeof(src->store));
break;
case StoreType::String:
dst->as<std::string>() = src->as<std::string>();
break;
case StoreType::Array:
dst->as<shared_array<const void>>() = src->as<shared_array<const void>>();
break;
case StoreType::Compound:
{
std::shared_ptr<impl::FieldStorage> sstore(Value::Helper::store(dlt),
src);
auto& dfld(dst->as<Value>());
Value::Helper::set_desc(dfld, &desc[i]);
Value::Helper::store(dfld) = std::move(sstore);
}
break;
}
}
}
namespace impl {
void FieldStorage::init(StoreType code)
+8
View File
@@ -41,6 +41,14 @@ struct Value::Helper {
static std::shared_ptr<const impl::FieldDesc> type(const Value& v);
};
/* Refresh cache from delta, and populate delta with previous.
* Requires matching types.
*
* copy marked from delta -> cache
* copy unmarked from cache -> delta
*/
void cache_sync(Value& cache, Value& delta);
namespace impl {
struct Buffer;