From 67eae3ea595b09902adb042ef7d5c70800af269b Mon Sep 17 00:00:00 2001 From: q66 Date: Sun, 12 Jul 2015 15:55:41 +0100 Subject: [PATCH] properly allocator aware concat() --- octa/string.hh | 48 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/octa/string.hh b/octa/string.hh index 3ea63b1..e5a052e 100644 --- a/octa/string.hh +++ b/octa/string.hh @@ -583,10 +583,10 @@ inline bool operator>=(const char *lhs, const StringBase &rhs) { return !(lhs < rhs); } -template -AnyString concat(const T &v, const S &sep, F func) { - AnyString ret; +template +AnyString concat(AllocatorArg, const A &alloc, const T &v, const S &sep, + F func) { + AnyString ret(alloc); auto range = octa::iter(v); if (range.empty()) return ret; for (;;) { @@ -598,10 +598,10 @@ AnyString concat(const T &v, const S &sep, F func) { return ret; } -template -AnyString concat(const T &v, const S &sep = " ") { - AnyString ret; +template +AnyString concat(AllocatorArg, const A &alloc, const T &v, + const S &sep = " ") { + AnyString ret(alloc); auto range = octa::iter(v); if (range.empty()) return ret; for (;;) { @@ -613,15 +613,35 @@ AnyString concat(const T &v, const S &sep = " ") { return ret; } -template -AnyString concat(std::initializer_list v, const S &sep, F func) { +template +String concat(const T &v, const S &sep, F func) { + return concat(allocator_arg, typename String::Allocator(), v, sep, func); +} + +template +String concat(const T &v, const S &sep = " ") { + return concat(allocator_arg, typename String::Allocator(), v, sep); +} + +template +AnyString concat(AllocatorArg, const A &alloc, + std::initializer_list v, const S &sep, F func) { + return concat(allocator_arg, alloc, octa::iter(v), sep, func); +} + +template +AnyString concat(AllocatorArg, const A &alloc, + std::initializer_list v, const S &sep = " ") { + return concat(allocator_arg, alloc, octa::iter(v), sep); +} + +template +String concat(std::initializer_list v, const S &sep, F func) { return concat(octa::iter(v), sep, func); } -template -AnyString concat(std::initializer_list v, const S &sep = " ") { +template +String concat(std::initializer_list v, const S &sep = " ") { return concat(octa::iter(v), sep); }