/*
* Copyright (c) 2024 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef META_API_ENGINE_UTIL_H
#define META_API_ENGINE_UTIL_H
#include
META_BEGIN_NAMESPACE()
inline void AddEngineValuesRecursively(
const IEngineValueManager::Ptr& m, const IEngineValue::Ptr& value, EngineValueOptions options = {})
{
BASE_NS::vector vec;
if (m->ConstructValues(
value, EngineValueOptions { options.namePrefix, &vec, options.pushValuesDirectlyToEngine })) {
if (options.values) {
options.values->insert(options.values->end(), vec.begin(), vec.end());
}
for (auto&& v : vec) {
AddEngineValuesRecursively(m, v, options);
}
}
}
inline void AddEngineValuesRecursively(
const IEngineValueManager::Ptr& m, CORE_NS::IPropertyHandle* handle, EngineValueOptions options = {})
{
BASE_NS::vector vec;
if (m->ConstructValues(
handle, EngineValueOptions { options.namePrefix, &vec, options.pushValuesDirectlyToEngine })) {
if (options.values) {
options.values->insert(options.values->end(), vec.begin(), vec.end());
}
for (auto&& v : vec) {
AddEngineValuesRecursively(
m, v, EngineValueOptions { "", options.values, options.pushValuesDirectlyToEngine });
}
}
}
inline bool SetEngineValueToProperty(const IProperty::Ptr& p, const IEngineValue::Ptr& value)
{
if (p && value && value->IsCompatible(p->GetTypeId())) {
if (auto i = interface_cast(p)) {
PropertyLock lock { p };
TypeId ids[] = { IEngineValue::UID };
for (auto&& v : i->GetValues(ids, false)) {
i->RemoveValue(v);
}
i->PushValue(value);
return true;
}
}
return false;
}
inline IEngineValue::Ptr GetEngineValueFromProperty(const IProperty::Ptr& p)
{
if (auto i = interface_cast(p)) {
PropertyLock lock { p };
TypeId ids[] = { IEngineValue::UID };
auto values = i->GetValues(ids, false);
if (!values.empty()) {
return interface_pointer_cast(values.back());
}
}
return nullptr;
}
META_END_NAMESPACE()
#endif