Home | History | Annotate | Download | only in utility
      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 
     39 namespace utility
     40 {
     41 
     42 /** Join all elements in [first, last[ with op.
     43  *
     44  *  If their is no element to join, return empty.
     45  *
     46  * Example (joining strings):
     47  * @verbatim
     48  * let op = [](auto l, auto r){ return l + "|" + r; }
     49  * let [first, last[ = list<string>{"1", "2", "3"}
     50  * then join(first, last, op) == "1|2|3"
     51  * @endverbatim
     52  */
     53 template <class T, class InputIt, class BinaryOperation>
     54 T join(InputIt first, InputIt last, BinaryOperation op, T empty = T{})
     55 {
     56     if (first == last) {
     57         return empty;
     58     }
     59     auto init = *first++;
     60 
     61     return std::accumulate(first, last, init, op);
     62 }
     63 
     64 /**
     65 * Format the items of a map into a string as a list of key-value pairs. The map must be
     66 * composed of pairs of strings.
     67 *
     68 * @param[in] lstr A list of strings
     69 * @param[in] separator The separator to use between each item
     70 *
     71 * @return the concatenated elements.
     72 */
     73 std::string asString(const std::list<std::string> &lstr, const std::string &separator = "\n");
     74 
     75 /**
     76  * Format the items of a map into a string as a list of key-value pairs. The map must be
     77  * composed of pairs of strings.
     78  *
     79  * @param[in] mapStr A map of strings
     80  * @param[in] strItemSeparator The separator to use between each item (key-value pair)
     81  * @param[in] strKeyValueSeparator The separator to use between key and value
     82  *
     83  * @returns the pretty-printed map
     84  */
     85 std::string asString(const std::map<std::string, std::string> &mapStr,
     86                      const std::string &strItemSeparator = ", ",
     87                      const std::string &strKeyValueSeparator = ":");
     88 
     89 /** Utility to underline */
     90 void appendTitle(std::string &strTo, const std::string &strTitle);
     91 
     92 /**
     93  * Checks if a string has the written representation of an hexadecimal
     94  * number (Which is the prefix "0x" or "0X" in C++).
     95  *
     96  * @param[in] strValue value as string
     97  *
     98  * @return true if the string is written as hexa, false otherwise.
     99  */
    100 bool isHexadecimal(const std::string &strValue);
    101 
    102 } // utility
    103