1 /* 2 * Copyright (c) 2011-2014, Intel Corporation 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without modification, 6 * are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this 9 * list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, 12 * this list of conditions and the following disclaimer in the documentation and/or 13 * other materials provided with the distribution. 14 * 15 * 3. Neither the name of the copyright holder nor the names of its contributors 16 * may be used to endorse or promote products derived from this software without 17 * specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #pragma once 32 33 #include <string> 34 #include <list> 35 #include <map> 36 #include <sstream> 37 #include <numeric> 38 #include <type_traits> 39 40 namespace utility 41 { 42 43 /** Join all elements in [first, last[ with op. 44 * 45 * If their is no element to join, return empty. 46 * 47 * Example (joining strings): 48 * @verbatim 49 * let op = [](auto l, auto r){ return l + "|" + r; } 50 * let [first, last[ = list<string>{"1", "2", "3"} 51 * then join(first, last, op) == "1|2|3" 52 * @endverbatim 53 */ 54 template <class T, class InputIt, class BinaryOperation> 55 T join(InputIt first, InputIt last, BinaryOperation op, T empty = T{}) 56 { 57 if (first == last) { 58 return empty; 59 } 60 auto init = *first++; 61 62 return std::accumulate(first, last, init, op); 63 } 64 65 /** 66 * Format the items of a sequence container of strings into a string. 67 * 68 * @tparam Sequence the string sequence container (e.g. list or vector) 69 * @param[in] lstr A list of strings 70 * @param[in] separator The separator to use between each item 71 * 72 * @return the concatenated elements. 73 */ 74 template <class Sequence> 75 std::string asString(const Sequence &lstr, const std::string &separator = "\n") 76 { 77 static_assert(std::is_same<typename Sequence::value_type, std::string>::value, 78 "asString called on a sequence container that does not contains strings"); 79 80 return join<std::string>( 81 begin(lstr), end(lstr), 82 [separator](std::string acc, std::string right) { return acc + separator + right; }); 83 } 84 85 /** 86 * Format the items of a map into a string as a list of key-value pairs. The map must be 87 * composed of pairs of strings. 88 * 89 * @param[in] mapStr A map of strings 90 * @param[in] strItemSeparator The separator to use between each item (key-value pair) 91 * @param[in] strKeyValueSeparator The separator to use between key and value 92 * 93 * @returns the pretty-printed map 94 */ 95 std::string asString(const std::map<std::string, std::string> &mapStr, 96 const std::string &strItemSeparator = ", ", 97 const std::string &strKeyValueSeparator = ":"); 98 99 /** Utility to underline */ 100 void appendTitle(std::string &strTo, const std::string &strTitle); 101 102 /** 103 * Checks if a string has the written representation of an hexadecimal 104 * number (Which is the prefix "0x" or "0X" in C++). 105 * 106 * @param[in] strValue value as string 107 * 108 * @return true if the string is written as hexa, false otherwise. 109 */ 110 bool isHexadecimal(const std::string &strValue); 111 112 } // namespace utility 113