Skip to content

Commit b43eaac

Browse files
committed
Add helper functions to build queries and stream resolvers
1 parent 48bf1e3 commit b43eaac

File tree

3 files changed

+48
-45
lines changed

3 files changed

+48
-45
lines changed

src/lsl_resolver_c.cpp

Lines changed: 7 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,7 @@ using namespace lsl;
1717
* The recommended default value is 5.0.
1818
*/
1919
LIBLSL_C_API lsl_continuous_resolver lsl_create_continuous_resolver(double forget_after) {
20-
try {
21-
// create a new resolver
22-
resolver_impl *resolver = new resolver_impl();
23-
// start it with the given query
24-
std::ostringstream os; os << "session_id='" << api_config::get_instance()->session_id() << "'";
25-
resolver->resolve_continuous(os.str(),forget_after);
26-
return resolver;
27-
} catch(std::exception &e) {
28-
LOG_F(ERROR, "Error while creating a continuous_resolver: %s", e.what());
29-
return nullptr;
30-
}
20+
return resolver_impl::create_resolver(forget_after);
3121
}
3222

3323
/**
@@ -40,17 +30,7 @@ LIBLSL_C_API lsl_continuous_resolver lsl_create_continuous_resolver(double forge
4030
* The recommended default value is 5.0.
4131
*/
4232
LIBLSL_C_API lsl_continuous_resolver lsl_create_continuous_resolver_byprop(const char *prop, const char *value, double forget_after) {
43-
try {
44-
// create a new resolver
45-
resolver_impl *resolver = new resolver_impl();
46-
// start it with the given query
47-
std::ostringstream os; os << "session_id='" << api_config::get_instance()->session_id() << "' and " << prop << "='" << value << "'";
48-
resolver->resolve_continuous(os.str(),forget_after);
49-
return resolver;
50-
} catch(std::exception &e) {
51-
LOG_F(ERROR, "Error while creating a continuous_resolver: %s", e.what());
52-
return nullptr;
53-
}
33+
return resolver_impl::create_resolver(forget_after, prop, value);
5434
}
5535

5636
/**
@@ -62,17 +42,7 @@ LIBLSL_C_API lsl_continuous_resolver lsl_create_continuous_resolver_byprop(const
6242
* The recommended default value is 5.0.
6343
*/
6444
LIBLSL_C_API lsl_continuous_resolver lsl_create_continuous_resolver_bypred(const char *pred, double forget_after) {
65-
try {
66-
// create a new resolver
67-
resolver_impl *resolver = new resolver_impl();
68-
// start it with the given query
69-
std::ostringstream os; os << "session_id='" << api_config::get_instance()->session_id() << "' and " << pred;
70-
resolver->resolve_continuous(os.str(),forget_after);
71-
return resolver;
72-
} catch(std::exception &e) {
73-
LOG_F(ERROR, "Error while creating a continuous_resolver: %s", e.what());
74-
return nullptr;
75-
}
45+
return resolver_impl::create_resolver(forget_after, pred, nullptr);
7646
}
7747

7848
/**
@@ -159,12 +129,8 @@ LIBLSL_C_API int32_t lsl_resolve_all(lsl_streaminfo *buffer, uint32_t buffer_ele
159129
*/
160130
LIBLSL_C_API int32_t lsl_resolve_byprop(lsl_streaminfo *buffer, uint32_t buffer_elements, const char *prop, const char *value, int32_t minimum, double timeout) {
161131
try {
162-
// create a new resolver
163-
resolver_impl resolver;
164-
// build a new query.
165-
std::ostringstream os; os << "session_id='" << api_config::get_instance()->session_id() << "' and " << prop << "='" << value << "'";
166-
// invoke it
167-
std::vector<stream_info_impl> tmp = resolver.resolve_oneshot(os.str(),minimum,timeout);
132+
std::string query{resolver_impl::build_query(prop, value)};
133+
auto tmp = resolver_impl().resolve_oneshot(query, minimum, timeout);
168134
// allocate new stream_info_impl's and assign to the buffer
169135
uint32_t result = buffer_elements<tmp.size() ? buffer_elements : (uint32_t)tmp.size();
170136
for (uint32_t k = 0; k < result; k++) buffer[k] = new stream_info_impl(tmp[k]);
@@ -192,12 +158,8 @@ LIBLSL_C_API int32_t lsl_resolve_byprop(lsl_streaminfo *buffer, uint32_t buffer_
192158
*/
193159
LIBLSL_C_API int32_t lsl_resolve_bypred(lsl_streaminfo *buffer, uint32_t buffer_elements, const char *pred, int32_t minimum, double timeout) {
194160
try {
195-
// create a new resolver
196-
resolver_impl resolver;
197-
// build a new query.
198-
std::ostringstream os; os << "session_id='" << api_config::get_instance()->session_id() << "' and " << pred;
199-
// invoke it
200-
std::vector<stream_info_impl> tmp = resolver.resolve_oneshot(os.str(),minimum,timeout);
161+
std::string query{resolver_impl::build_query(pred)};
162+
auto tmp = resolver_impl().resolve_oneshot(query, minimum, timeout);
201163
// allocate new stream_info_impl's and assign to the buffer
202164
uint32_t result = buffer_elements<tmp.size() ? buffer_elements : (uint32_t)tmp.size();
203165
for (uint32_t k = 0; k < result; k++) buffer[k] = new stream_info_impl(tmp[k]);

src/resolver_impl.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,28 @@ void check_query(const std::string& query) {
7070
}
7171
}
7272

73+
std::string resolver_impl::build_query(const char* pred_or_prop, const char* value)
74+
{
75+
std::string query("session_id='");
76+
query += api_config::get_instance()->session_id();
77+
query += '\'';
78+
if (pred_or_prop) (query += " and ") += pred_or_prop;
79+
if (value) ((query += "='") += value) += '\'';
80+
return query;
81+
}
82+
83+
resolver_impl *resolver_impl::create_resolver(
84+
double forget_after, const char *pred_or_prop, const char *value) noexcept {
85+
try {
86+
auto *resolver = new resolver_impl();
87+
resolver->resolve_continuous(build_query(pred_or_prop, value), forget_after);
88+
return resolver;
89+
} catch (std::exception &e) {
90+
LOG_F(ERROR, "Error while creating a continuous_resolver: %s", e.what());
91+
return nullptr;
92+
}
93+
}
94+
7395
// === resolve functions ===
7496

7597
/**

src/resolver_impl.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,25 @@ namespace lsl {
4444
*/
4545
resolver_impl();
4646

47+
/** Build a query string
48+
*
49+
* @param pred_or_prop an entire predicate if value isn't set or the
50+
* name of the property, e.g. "foo='bar'" / "foo" (+value set as "bar")
51+
* @param value the value for the property parameter
52+
*/
53+
static std::string build_query(
54+
const char *pred_or_prop = nullptr, const char *value = nullptr);
55+
56+
/** Create a resolver object with optionally a predicate or property + value
57+
*
58+
* @param pred_or_prop an entire predicate of value isn't set or the
59+
* name of the property, e.g. "foo='bar'" / "foo" (+value set as "bar")
60+
* @param value the value for the property parameter
61+
* @return A pointer to the resolver on success or nullptr on error
62+
*/
63+
static resolver_impl *create_resolver(double forget_after,
64+
const char *pred_or_prop = nullptr, const char *value = nullptr) noexcept;
65+
4766
/// Destructor.
4867
/// Cancels any ongoing processes and waits until they finish.
4968
~resolver_impl();

0 commit comments

Comments
 (0)