Home | History | Annotate | Line # | Download | only in text
      1 // Copyright 2012 Google Inc.
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are
      6 // met:
      7 //
      8 // * Redistributions of source code must retain the above copyright
      9 //   notice, this list of conditions and the following disclaimer.
     10 // * Redistributions in binary form must reproduce the above copyright
     11 //   notice, this list of conditions and the following disclaimer in the
     12 //   documentation and/or other materials provided with the distribution.
     13 // * Neither the name of Google Inc. nor the names of its contributors
     14 //   may be used to endorse or promote products derived from this software
     15 //   without specific prior written permission.
     16 //
     17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 
     29 #if !defined(UTILS_TEXT_OPERATIONS_IPP)
     30 #define UTILS_TEXT_OPERATIONS_IPP
     31 
     32 #include "utils/text/operations.hpp"
     33 
     34 #include <sstream>
     35 
     36 #include "utils/text/exceptions.hpp"
     37 
     38 
     39 /// Concatenates a collection of strings into a single string.
     40 ///
     41 /// \param strings The collection of strings to concatenate.  If the collection
     42 ///     is unordered, the ordering in the output is undefined.
     43 /// \param delimiter The delimiter to use to separate the strings.
     44 ///
     45 /// \return The concatenated strings.
     46 template< typename Collection >
     47 std::string
     48 utils::text::join(const Collection& strings, const std::string& delimiter)
     49 {
     50     std::ostringstream output;
     51     if (strings.size() > 1) {
     52         for (typename Collection::const_iterator iter = strings.begin();
     53              iter != --strings.end(); ++iter)
     54             output << (*iter) << delimiter;
     55     }
     56     if (strings.size() > 0)
     57         output << *(--strings.end());
     58     return output.str();
     59 }
     60 
     61 
     62 /// Converts a string to a native type.
     63 ///
     64 /// \tparam Type The type to convert the string to.  An input stream operator
     65 ///     must exist to extract such a type from an std::istream.
     66 /// \param str The string to convert.
     67 ///
     68 /// \return The converted string, if the input string was valid.
     69 ///
     70 /// \throw std::value_error If the input string does not represent a valid
     71 ///     target type.  This exception does not include any details, so the caller
     72 ///     must take care to re-raise it with appropriate details.
     73 template< typename Type >
     74 Type
     75 utils::text::to_type(const std::string& str)
     76 {
     77     if (str.empty())
     78         throw text::value_error("Empty string");
     79     if (str[0] == ' ')
     80         throw text::value_error("Invalid value");
     81 
     82     std::istringstream input(str);
     83     Type value;
     84     input >> value;
     85     if (!input.eof() || input.bad() || input.fail())
     86         throw text::value_error("Invalid value");
     87     return value;
     88 }
     89 
     90 
     91 #endif  // !defined(UTILS_TEXT_OPERATIONS_IPP)
     92