#ifndef NBASICS_H #define NBASICS_H #include "types.h" #include namespace NBasics { /** Remove an element from a container */ template bool ContainerRemoveOne(ContainerT& Container, const T& kElement) { for (auto Iter = Container.begin(); Iter != Container.end(); Iter++) { if (*Iter == kElement) { Container.erase(Iter); return true; } } return false; } template inline bool VectorRemoveOne(std::vector& Vector, const T& kElement) { return ContainerRemoveOne< T, std::vector >(Vector, kElement); } template inline bool ListRemoveOne(std::list& List, const T& kElement) { return ContainerRemoveOne< T, std::list >(List, kElement); } /** Remove all occurrences of an element from a container. Returns the number of elements that were removed. */ template int ContainerRemoveAll(ContainerT& Container, const T& kElement) { int NumRemoved = 0; for (auto Iter = Container.begin(); Iter != Container.end(); Iter++) { if (*Iter == kElement) { Iter = Container.erase(Iter); NumRemoved++; } } return NumRemoved; } template inline int VectorRemoveAll(std::vector& Vector, const T& kElement) { return ContainerRemoveAll< T, std::vector >(Vector, kElement); } template inline int ListRemoveAll(std::list& List, const T& kElement) { return ContainerRemoveAll< T, std::list >(List, kElement); } /** Returns whether the vector contains the given element */ template bool VectorContains(std::vector& Vector, const T& kElement) { for (auto Iter = Vector.begin(); Iter != Vector.end(); Iter++) { if (*Iter == kElement) { return true; } } return false; } /** Adds an element to a vector only if it is not already present */ template bool VectorAddUnique(std::vector& Vector, const T& kElement) { if (!VectorContainsElement(Vector, kElement)) { Vector.push_back(kElement); return true; } return false; } } #endif // NBASICS_H