13 #ifndef INCLUDE_MOLASSEMBLER_TEMPLE_FUNCTIONAL_H
14 #define INCLUDE_MOLASSEMBLER_TEMPLE_FUNCTIONAL_H
22 namespace Molassembler {
27 std::enable_if_t<Traits::hasSize<Container>::value,
int> = 0
28 >
auto size(
const Container& container) {
29 return container.size();
34 std::enable_if_t<!Traits::hasSize<Container>::value,
int> = 0
35 >
auto size(
const Container& container) {
37 std::begin(container),
71 template<
typename,
typename...>
class Container,
72 template<
typename>
class ... Dependents
74 const Container<T, Dependents<T>...>& container,
75 UnaryFunction&&
function
78 invoke(
function, *std::begin(container))
81 Container<U, Dependents<U>...> returnContainer;
84 for(
const auto&
element : container) {
91 return returnContainer;
96 template<
typename, std::
size_t>
class ArrayType,
101 const ArrayType<T, size>& container,
102 UnaryFunction&&
function
105 invoke(
function, *std::begin(container))
108 ArrayType<U, size> returnContainer;
110 for(
unsigned i = 0; i < size; ++i) {
111 returnContainer[i] =
invoke(
function, container[i]);
114 return returnContainer;
119 template<
typename,
typename>
class PairType,
123 const PairType<T, T>& pair,
124 UnaryFunction&&
function
127 invoke(
function, pair.first)
130 return PairType<U, U> {
131 function(pair.first),
132 function(pair.second)
140 template<
class Container,
class UnaryFunction>
141 auto map(Container&& container, UnaryFunction&&
function) {
143 invoke(
function, *std::begin(container))
146 std::vector<U> returnContainer;
149 for(
auto&& value : container) {
150 returnContainer.push_back(
151 invoke(
function, std::move(value))
155 return returnContainer;
158 template<
class Pairlike,
typename Unary>
159 auto mapHomogeneousPairlike(Pairlike p, Unary&& f) {
160 return std::make_pair(f(p.first), f(p.second));
164 template<
class Container,
class Callable>
166 const Container& container,
169 for(
const auto& value : container) {
189 typename ComparisonFunction,
190 typename MappingFunction
192 typename Container::const_iterator
select(
193 const Container& container,
194 ComparisonFunction&& comparator,
195 MappingFunction&& mapFunction
197 auto selection = std::begin(container);
198 auto selectionValue = mapFunction(*selection);
200 auto iter = std::begin(container);
202 while(iter != std::end(container)) {
203 auto currentValue = mapFunction(*iter);
206 if(comparator(currentValue, selectionValue)) {
208 selectionValue = currentValue;
227 const Container& container,
229 BinaryFunction&& reductionFunction
231 for(
const auto& value: container) {
233 init =
invoke(reductionFunction, std::move(init), value);
243 template<
class Container,
class UnaryPredicate = Functor::Identity>
244 bool all_of(
const Container& container, UnaryPredicate&& predicate = UnaryPredicate {}) {
245 for(
const auto&
element : container) {
258 template<
class Container,
class UnaryPredicate = Functor::Identity>
259 bool any_of(
const Container& container, UnaryPredicate&& predicate = UnaryPredicate {}) {
260 for(
const auto&
element : container) {
270 template<
class Container>
271 void sort(Container& container) {
273 std::begin(container),
279 template<
class Container,
typename Comparator>
280 void sort(Container& container, Comparator&& comparator) {
282 std::begin(container),
284 std::forward<Comparator>(comparator)
289 template<
class Container>
292 std::begin(container),
298 template<
class Container,
typename T>
300 Container& container,
305 std::begin(container),
314 template<
class Container,
class UnaryFunction>
316 Container& container,
317 UnaryFunction&& predicate
321 std::begin(container),
323 std::forward<UnaryFunction>(predicate)
330 template<
class Container,
class Predicate>
331 Container copy_if(
const Container& container, Predicate&& predicate) {
332 Container returnContainer;
334 for(
const auto& value : container) {
335 if(
invoke(predicate, value)) {
340 return returnContainer;
344 template<
class Container>
345 Container sorted(Container container) {
351 template<
class Container,
typename Comparator>
352 Container sorted(Container container, Comparator&& comparator) {
353 sort(container, std::forward<Comparator>(comparator));
358 template<
class Container,
typename T>
359 auto find(
const Container& container,
const T& needle) {
361 std::begin(container),
368 template<
class Container,
typename UnaryPredicate>
369 auto find_if(
const Container& container, UnaryPredicate&& predicate) {
371 std::begin(container),
373 std::forward<UnaryPredicate>(predicate)
379 std::vector<T>
iota(
unsigned upperBound) {
380 std::vector<T> values(upperBound);
392 template<
class Container>
394 using T = Traits::getValueType<Container>;
396 return [&container](
const T&
element) ->
bool {
398 std::begin(container),
401 ) != std::end(container);
407 template<
typename Transformation>
409 Map(Transformation&& f) : t(f) {}
411 template<
typename Container>
412 auto operator() (
const Container& c) {
419 template<
typename Transformation>
420 auto map(Transformation&& t) {
void sort(Container &container)
Calls std::sort on a container.
Definition: Functional.h:271
PURITY_STRONG constexpr std::enable_if_t< std::is_arithmetic< T >::value, ArrayType< T, size >> iota()
Iota for any array type.
Definition: Containers.h:145
Uniform callable invoke from arguments or tuple of arguments.
void remove_if(Container &container, UnaryFunction &&predicate)
Applies erase-remove idiom in-place to container with a predicate function.
Definition: Functional.h:315
auto find_if(const Container &container, UnaryPredicate &&predicate)
std::find_if shorthand
Definition: Functional.h:369
double element(const PositionCollection &normalizedPositions, const Elements::Rotation &rotation)
Returns the CSM for a Rotation symmetry element along the rotation axis without optimizing the coordi...
auto map_stl(const Container< T, Dependents< T >...> &container, UnaryFunction &&function)
Definition: Functional.h:73
void reserveIfPossible(TargetContainer &target, const SourceContainer &source, SizeModifierUnary &&sourceModifierUnary=SizeModifierUnary{})
Rerves the space required in the target container if size can be determined from the source container...
Definition: AddToContainer.h:201
Definition: Functional.h:408
Central interface to add elements to many types of containers.
void remove(Container &container, const T &value)
Applies erase-remove idiom in-place to container.
Definition: Functional.h:299
T accumulate(const Container &container, T init, BinaryFunction &&reductionFunction)
Accumulate shorthand.
Definition: Functional.h:226
Temple::Array< T, size > ArrayType
Definition: Properties.h:143
void forEach(const Container &container, Callable &&callable)
Apply a callable for all values of a container.
Definition: Functional.h:165
void reverse(Container &container)
In-place reversal.
Definition: Functional.h:290
unsigned size(const Shape shape)
Fetch the number of vertices of a shape.
bool any_of(const Container &container, UnaryPredicate &&predicate=UnaryPredicate{})
any_of shorthand
Definition: Functional.h:259
constexpr auto map(const ArrayType< T, size > &array, UnaryFunction &&function)
Maps all elements of any array-like container with a unary function.
Definition: Containers.h:62
auto makeContainsPredicate(const Container &container)
Creates a predicate that uses std::find for the container's value type.
Definition: Functional.h:393
Container::const_iterator select(const Container &container, ComparisonFunction &&comparator, MappingFunction &&mapFunction)
Select a value from a container.
Definition: Functional.h:192
void addToContainer(Container &container, const T &value)
Adds an lvalue element to a container by calling the container's insert or push_back member functions...
Definition: AddToContainer.h:179
auto find(const Container &container, const T &needle)
std::find shorthand
Definition: Functional.h:359
auto invoke(Function &&function, const boost::tuples::cons< HT, TT > &tuple)
Invokes a function with all values in a given boost tuple.
Definition: Invoke.h:44
bool all_of(const Container &container, UnaryPredicate &&predicate=UnaryPredicate{})
all_of shorthand
Definition: Functional.h:244