#ifndef CONTAINER_UTILS_H #define CONTAINER_UTILS_H #include #include #include #include #include #include #include namespace sls { // C++11 make_unique implementation for exeption safety // already available as std::make_unique in C++14 template std::unique_ptr make_unique(Args &&... args) { return std::unique_ptr(new T(std::forward(args)...)); } template bool allEqual(const std::vector& container) { if (container.empty()) return false; const auto& first = container[0]; return std::all_of(container.cbegin(), container.cend(), [first](const T& element) { return element == first; }); } template typename std::enable_if::value, bool>::type allEqualWithTol(const std::vector& container, const T tol) { if (container.empty()) return false; const auto& first = container[0]; return std::all_of(container.cbegin(), container.cend(), [first, tol](const T& element) { return (std::abs(element - first) < tol); }); } template bool allEqualTo(const std::vector& container, const T value) { if (container.empty()) return false; return std::all_of(container.cbegin(), container.cend(), [value](const T& element) { return element == value; }); } template bool allEqualToWithTol(const std::vector& container, const T value, const T tol) { if (container.empty()) return false; return std::all_of(container.cbegin(), container.cend(), [value, tol](const T& element) { return (std::abs(element - value) < tol); }); } template bool anyEqualTo(const std::vector& container, const T value) { return std::any_of(container.cbegin(), container.cend(), [value](const T& element) { return element == value; }); } template bool anyEqualToWithTol(const std::vector& container, const T value, const T tol) { return std::any_of(container.cbegin(), container.cend(), [value, tol](const T& element) { return (std::abs(element - value) < tol); }); } template typename std::enable_if::value, T>::type sum(const std::vector& container) { return std::accumulate(container.cbegin(), container.cend(), T{ 0 }); } template T minusOneIfDifferent(const std::vector& container) { if (allEqual(container)) { return container.front(); } else { return static_cast(-1); } } //TODO!(Erik)Should try to move away from using this in the slsDetectorPackage std::string concatenateIfDifferent(std::vector container) { if (allEqual(container)) { return container.front(); } else { std::string result; for (const auto& s : container) result += s + "+"; return result; } } std::vector split(const std::string& strToSplit, char delimeter) { std::stringstream ss(strToSplit); std::string item; std::vector splittedStrings; while (std::getline(ss, item, delimeter)) { splittedStrings.push_back(item); } return splittedStrings; } std::string concatenateNonEmptyStrings(const std::vector& vec){ std::string ret; for (const auto& s : vec) if (!s.empty()) ret += s + "+"; return ret; } } // namespace sls #endif // CONTAINER_UTILS_H