From 890117f2d4e934745998df0300b0df7354e7231b Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 31 Jan 2018 17:20:43 +0100 Subject: [PATCH] feat(Utils): add a algorithm file to centralize generic algorithm --- include/CMakeLists.txt | 1 + include/linphone/utils/algorithm.h | 65 ++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 include/linphone/utils/algorithm.h diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index eb505c75c..055f1840d 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -98,6 +98,7 @@ set(ENUMS_HEADER_FILES ) set(UTILS_HEADER_FILES + algorithm.h enum-generator.h enum-mask.h fs.h diff --git a/include/linphone/utils/algorithm.h b/include/linphone/utils/algorithm.h new file mode 100644 index 000000000..e161ed2b5 --- /dev/null +++ b/include/linphone/utils/algorithm.h @@ -0,0 +1,65 @@ +/* + * algorithm.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program 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; either version 2 + * of the License, or (at your option) any later version. + * + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_ALGORITHM_H_ +#define _L_ALGORITHM_H_ + +#include + +#include "general.h" + +// ============================================================================= + +// NOTE: Maybe use https://github.com/ericniebler/range-v3 one day? + +LINPHONE_BEGIN_NAMESPACE + +template +inline typename T::const_iterator find (const T &container, const Value &value) { + return std::find(container.cbegin(), container.cend(), value); +} + +template +inline typename T::iterator find (T &container, const Value &value) { + return std::find(container.begin(), container.end(), value); +} + +template +inline typename T::const_iterator findIf (const T &container, Predicate predicate) { + return std::find_if(container.cbegin(), container.cend(), predicate); +} + +template +inline typename T::iterator findIf (T &container, Predicate predicate) { + return std::find_if(container.begin(), container.end(), predicate); +} + +template +inline bool removeFirst (T &container, const Value &value) { + auto it = find(container, value); + if (it != container.end()) { + container.erase(it); + return true; + } + return false; +} + +LINPHONE_END_NAMESPACE + +#endif // ifndef _L_ALGORITHM_H_