1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
/*
* Copyright 2017 Samsung Electronics Co., Ltd
*
* Licensed under the Flora License, Version 1.1 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://floralicense.org/license/
*
* 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.
*/
#include "ucl/util/helpers.h"
#include "ucl/util/logging.h"
namespace gallery { namespace util { namespace himpl {
template <class GETTER, class ...ARGS>
inline ucl::Result get(GETTER &&getter, bool optional,
std::string &result, ARGS &&...args)
{
char *value = nullptr;
const int ret = getter(std::forward<ARGS>(args)..., &value);
if ((ret != 0) || (!optional && ucl::isEmpty(value))) {
UCL_ELOG("get() failed: %d", ret);
return ucl::RES_FAIL;
}
if (value) {
result = value;
free(value);
} else {
result.clear();
}
return ucl::RES_OK;
}
template <class GETTER, class V, class ...ARGS>
inline ucl::Result get(GETTER &&getter, bool optional,
V &result, ARGS &&...args)
{
typename std::remove_pointer<decltype(&result)>::type value = {};
const int ret = getter(std::forward<ARGS>(args)..., &value);
if ((ret != 0) || (!optional && !value)) {
UCL_ELOG("get() failed: %d", ret);
return ucl::RES_FAIL;
}
result = value;
return ucl::RES_OK;
}
}}}
namespace gallery { namespace util {
template <class GETTER, class V, class ...ARGS>
inline ucl::Result get(GETTER &&getter, V &result, ARGS &&...args)
{
return himpl::get(std::forward<GETTER>(getter), true,
result, std::forward<ARGS>(args)...);
}
template <class GETTER, class V, class ...ARGS>
inline ucl::Result getNz(GETTER &&getter, V &result, ARGS &&...args)
{
return himpl::get(std::forward<GETTER>(getter), false,
result, std::forward<ARGS>(args)...);
}
template <class FUNC, class ...ARGS>
inline ucl::Result call(FUNC &&func, ARGS &&...args)
{
const int ret = func(std::forward<ARGS>(args)...);
if (ret != 0) {
UCL_ELOG("func() failed: %d", ret);
return ucl::RES_FAIL;
}
return ucl::RES_OK;
}
template <class FUNC, class TO_RESULT, class ...ARGS>
ucl::Result callEx(FUNC &&func, TO_RESULT &&toResult, ARGS &&...args)
{
const int ret = func(std::forward<ARGS>(args)...);
UCL_FAIL_RETURN(toResult(ret), "func() failed: %d", ret);
return ucl::RES_OK;
}
}}
|