Parallel returns Result

This commit is contained in:
Erik Frojdh 2019-08-09 11:40:57 +02:00
parent dfbf7ab39a
commit fc78bb9384
5 changed files with 50 additions and 14 deletions

View File

@ -40,7 +40,7 @@ auto main() -> int {
std::cout << "res.squash(-1): " << res.squash(-1) << '\n';
std::cout << "res3.squash(-1): " << res3.squash(-1) << '\n';
std::vector<int> ivec{1, 3, 5};
Result<int> ivec{1, 3, 5};
Result<sls::time::ns> nres(ivec);
// for (const auto& i : ivec)

View File

@ -841,6 +841,21 @@ class Detector {
/** [CTB] Value between 0-63 */
void setExternalSamplingSource(int value, Positions pos = {});
/** [CTB] */
uint32_t getADCInvert() const;
/** [CTB]*/
void setADCInvert(uint32_t value);
/** [CTB]*/
uint32_t getADCEnableMask(int detPos = -1);
/** [CTB]*/
void setADCEnableMask(uint32_t mask);
/** [CTB]*/
uint32_t getADCEnableMask() const;
};
} // namespace sls

View File

@ -31,12 +31,13 @@ template <class T, class Allocator = std::allocator<T>> class Result {
Result() = default;
Result(std::initializer_list<T> list) : vec(list){};
/** Custom constructor from integer type to Result<ns> or Result<bool> */
template <typename V, typename = typename std::enable_if<
std::is_integral<V>::value &&
(std::is_same<T, time::ns>::value ||
std::is_same<T, bool>::value)>::type>
Result(const std::vector<V> &from) {
Result(const Result<V> &from) {
vec.reserve(from.size());
for (const auto &item : from)
vec.push_back(T(item));
@ -47,7 +48,7 @@ template <class T, class Allocator = std::allocator<T>> class Result {
std::is_integral<V>::value &&
(std::is_same<T, time::ns>::value ||
std::is_same<T, bool>::value)>::type>
Result(std::vector<V> &from) {
Result(Result<V> &from) {
vec.reserve(from.size());
for (const auto &item : from)
vec.push_back(T(item));
@ -58,7 +59,7 @@ template <class T, class Allocator = std::allocator<T>> class Result {
std::is_integral<V>::value &&
(std::is_same<T, time::ns>::value ||
std::is_same<T, bool>::value)>::type>
Result(std::vector<V> &&from) {
Result(Result<V> &&from) {
vec.reserve(from.size());
for (const auto &item : from)
vec.push_back(T(item));
@ -90,6 +91,7 @@ template <class T, class Allocator = std::allocator<T>> class Result {
auto empty() const noexcept -> decltype(vec.empty()) { return vec.empty(); }
auto front() -> decltype(vec.front()) { return vec.front(); }
auto front() const -> decltype(vec.front()) { return vec.front(); }
void reserve(size_type new_cap) { vec.reserve(new_cap); }
template <typename V>
auto push_back(V value) -> decltype(vec.push_back(value)) {

View File

@ -3,6 +3,7 @@
#include "SharedMemory.h"
#include "logger.h"
#include "sls_detector_defs.h"
#include "Result.h"
class slsDetector;
class ZmqSocket;
@ -113,7 +114,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
template <class CT> struct NonDeduced { using type = CT; };
template <typename RT, typename... CT>
std::vector<RT> Parallel(RT (slsDetector::*somefunc)(CT...),
sls::Result<RT> Parallel(RT (slsDetector::*somefunc)(CT...),
std::vector<int> positions,
typename NonDeduced<CT>::type... Args) {
@ -130,7 +131,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
futures.push_back(std::async(std::launch::async, somefunc,
detectors[i].get(), Args...));
}
std::vector<RT> result;
sls::Result<RT> result;
result.reserve(positions.size());
for (auto &i : futures) {
result.push_back(i.get());
@ -139,7 +140,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
}
template <typename RT, typename... CT>
std::vector<RT> Parallel(RT (slsDetector::*somefunc)(CT...) const,
sls::Result<RT> Parallel(RT (slsDetector::*somefunc)(CT...) const,
std::vector<int> positions,
typename NonDeduced<CT>::type... Args) const {
@ -156,7 +157,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
futures.push_back(std::async(std::launch::async, somefunc,
detectors[i].get(), Args...));
}
std::vector<RT> result;
sls::Result<RT> result;
result.reserve(positions.size());
for (auto &i : futures) {
result.push_back(i.get());
@ -1452,35 +1453,35 @@ class multiSlsDetector : public virtual slsDetectorDefs {
* @param mask ADC Enable mask
* @param detPos -1 for all detectors in list or specific detector position
*/
void setADCEnableMask(uint32_t mask, int detPos = -1);
void setADCEnableMask(uint32_t mask, int detPos = -1); //
/**
* Get ADC Enable Mask (CTB, Moench)
* @param detPos -1 for all detectors in list or specific detector position
* @returns ADC Enable mask
*/
uint32_t getADCEnableMask(int detPos = -1);
uint32_t getADCEnableMask(int detPos = -1); //
/**
* Set ADC invert register (CTB, Moench)
* @param value ADC invert value
* @param detPos -1 for all detectors in list or specific detector position
*/
void setADCInvert(uint32_t value, int detPos = -1);
void setADCInvert(uint32_t value, int detPos = -1); //
/**
* Get ADC invert register (CTB, Moench)
* @param detPos -1 for all detectors in list or specific detector position
* @returns ADC invert value
*/
uint32_t getADCInvert(int detPos = -1);
uint32_t getADCInvert(int detPos = -1); //
/**
* Set external sampling source (CTB only)
* @param value external sampling source (Option: 0-63)
* @param detPos -1 for all detectors in list or specific detector position
*/
void setExternalSamplingSource(int value, int detPos = -1);
void setExternalSamplingSource(int value, int detPos = -1); //
/**
* Get external sampling source (CTB only)

View File

@ -731,4 +731,22 @@ void Detector::setExternalSamplingSource(int value, Positions pos) {
pimpl->Parallel(&slsDetector::setExternalSamplingSource, pos, value);
}
uint32_t Detector::getADCInvert() const {
auto res = pimpl->Parallel(&slsDetector::getADCInvert, {});
return res.tsquash("Different Values for function getADCInvert");
}
void Detector::setADCInvert(uint32_t value) {
pimpl->Parallel(&slsDetector::setADCInvert, {}, value);
}
uint32_t Detector::getADCEnableMask() const {
return pimpl->Parallel(&slsDetector::getADCEnableMask, {})
.tsquash("Values of ADC enable mask cannot be different");
}
void Detector::setADCEnableMask(uint32_t mask) {
pimpl->Parallel(&slsDetector::setADCEnableMask, {}, mask);
}
} // namespace sls