diff options
author | Attila Molnar <attilamolnar@hush.com> | 2014-03-24 16:33:09 +0100 |
---|---|---|
committer | Attila Molnar <attilamolnar@hush.com> | 2014-03-24 16:33:09 +0100 |
commit | 671a80a70be60ccad1c0176556487c09be810489 (patch) | |
tree | 367ded7ad850add426817e91b5e9f86003f5d0e2 | |
parent | d60103cada2c954f6d735c0ae4fb7d9b1b5ed844 (diff) |
Create the stdalgo namespace for container-related algorithms, add stdalgo::vector::swaperase()
-rw-r--r-- | include/inspircd.h | 1 | ||||
-rw-r--r-- | include/stdalgo.h | 66 |
2 files changed, 67 insertions, 0 deletions
diff --git a/include/inspircd.h b/include/inspircd.h index a707eec73..bf3cb06b0 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -46,6 +46,7 @@ #include "intrusive_list.h" #include "compat.h" #include "typedefs.h" +#include "stdalgo.h" CoreExport extern InspIRCd* ServerInstance; diff --git a/include/stdalgo.h b/include/stdalgo.h new file mode 100644 index 000000000..758845312 --- /dev/null +++ b/include/stdalgo.h @@ -0,0 +1,66 @@ +/* + * InspIRCd -- Internet Relay Chat Daemon + * + * Copyright (C) 2014 Attila Molnar <attilamolnar@hush.com> + * + * This file is part of InspIRCd. InspIRCd is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + +#pragma once + +namespace stdalgo +{ + namespace vector + { + /** + * Erase a single element from a vector by overwriting it with a copy of the last element, + * which is then removed. This, in contrast to vector::erase(), does not result in all + * elements after the erased element being moved. + * @param vect Vector to remove the element from + * @param it Iterator to the element to remove + * @return Nothing, but all iterators, references and pointers to the erased element and the + * last element are invalidated + */ + template <typename T> + inline void swaperase(typename std::vector<T>& vect, const typename std::vector<T>::iterator& it) + { + *it = vect.back(); + vect.pop_back(); + } + + /** + * Find and if exists, erase a single element from a vector by overwriting it with a + * copy of the last element, which is then removed. This, in contrast to vector::erase(), + * does not result in all elements after the erased element being moved. + * If the given value occurs multiple times, the one with the lowest index is removed. + * Individual elements are compared to the given value using operator==(). + * @param vect Vector to remove the element from + * @param val Value of the element to look for and remove + * @return True if the element was found and removed, false if it wasn't found. + * If true, all iterators, references and pointers pointing to either the first element that + * is equal to val or to the last element are invalidated. + */ + template <typename T> + inline bool swaperase(typename std::vector<T>& vect, const T& val) + { + const typename std::vector<T>::iterator it = std::find(vect.begin(), vect.end(), val); + if (it != vect.end()) + { + swaperase(vect, it); + return true; + } + return false; + } + } +} |