1e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/* 2e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Copyright (C) 2015 The Android Open Source Project 3e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 4e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Licensed under the Apache License, Version 2.0 (the "License"); 5e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * you may not use this file except in compliance with the License. 6e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * You may obtain a copy of the License at 7e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 8e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * http://www.apache.org/licenses/LICENSE-2.0 9e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 10e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Unless required by applicable law or agreed to in writing, software 11e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * distributed under the License is distributed on an "AS IS" BASIS, 12e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * See the License for the specific language governing permissions and 14e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * limitations under the License. 15e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 16e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 17e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#pragma once 18e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 19e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <limits> 20e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <sstream> 21e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <string> 22e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <vector> 23e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <stdint.h> 24e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <cmath> 25e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 26e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace android 27e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 28e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 29e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace utilities 30e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 31e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 32e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/** 33e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Convert a given source type to a given destination type. 34e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 35e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * String conversion to T reads the value of the type T in the given string. 36e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * The function does not allow to have white spaces around the value to parse 37e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * and tries to parse the whole string, which means that if some bytes were not 38e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * read in the string, the function fails. 39e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Hexadecimal representation (ie. numbers starting with 0x) is supported only 40e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * for integral types conversions. 41e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 42e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Numeric conversion to string formats the source value to decimal space. 43e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 44e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Vector to vector conversion calls convertTo on each element. 45e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @tparam srcType source type, default value is string type 47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @tparam dstType destination type 48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[in] input The source to convert from. 49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[out] result Converted value if success, undefined on failure. 50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @return true if conversion was successful, false otherwise. 52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <typename srcType, typename dstType> 54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstatic inline bool convertTo(const srcType &input, dstType &result); 55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/* details namespace is here to hide implementation details to header end user. It 57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * is NOT intended to be used outside. */ 58e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace details 59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/** Helper class to limit instantiation of templates */ 62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <typename T> 63e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionFromStringAllowed; 64e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <typename T> 65e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionToStringAllowed; 66e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 67e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/* List of allowed types for conversion */ 68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionFromStringAllowed<bool> {}; 70e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 71e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionFromStringAllowed<uint64_t> {}; 72e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionFromStringAllowed<int64_t> {}; 74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionFromStringAllowed<uint32_t> {}; 76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionFromStringAllowed<int32_t> {}; 78e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 79e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionFromStringAllowed<uint16_t> {}; 80e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 81e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionFromStringAllowed<int16_t> {}; 82e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 83e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionFromStringAllowed<float> {}; 84e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 85e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionFromStringAllowed<double> {}; 86e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 87e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 88e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionToStringAllowed<int64_t> {}; 89e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 90e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionToStringAllowed<uint64_t> {}; 91e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 92e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionToStringAllowed<uint32_t> {}; 93e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 94e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionToStringAllowed<int32_t> {}; 95e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 96e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionToStringAllowed<double> {}; 97e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 98e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct ConversionToStringAllowed<float> {}; 99e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 100e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/** 101e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Set the decimal precision to 10 digits. 102e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Note that this setting is aligned with Android Audio Parameter 103e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * policy concerning float storage into string. 104e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 105e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstatic const uint32_t gFloatPrecision = 10; 106e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 107e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <typename T> 108e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstatic inline bool fromString(const std::string &str, T &result) 109e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 110e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman /* Check that conversion to that type is allowed. 111e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * If this fails, this means that this template was not intended to be used 112e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * with this type, thus that the result is undefined. */ 113e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman ConversionFromStringAllowed<T>(); 114e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 115e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (str.find_first_of(std::string("\r\n\t\v ")) != std::string::npos) { 116e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return false; 117e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 118e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 119e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman /* Check for a '-' in string. If type is unsigned and a - is found, the 120e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * parsing fails. This is made necessary because "-1" is read as 65535 for 121e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * uint16_t, for example */ 122e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (str.find("-") != std::string::npos 123e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman && !std::numeric_limits<T>::is_signed) { 124e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return false; 125e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 126e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 127e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman std::stringstream ss(str); 128e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 129e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman /* Sadly, the stream conversion does not handle hexadecimal format, thus 130e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * check is done manually */ 131e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (str.substr(0, 2) == "0x") { 132e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (std::numeric_limits<T>::is_integer) { 133e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman ss >> std::hex >> result; 134e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } else { 135e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman /* Conversion undefined for non integers */ 136e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return false; 137e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 138e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } else { 139e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman ss >> result; 140e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 141e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 142e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return ss.eof() && !ss.fail() && !ss.bad(); 143e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} 144e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 145e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <typename T> 146e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstatic inline bool toString(const T &value, std::string &str) 147e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 148e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman /* Check that conversion from that type is allowed. 149e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * If this fails, this means that this template was not intended to be used 150e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * with this type, thus that the result is undefined. */ 151e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman ConversionToStringAllowed<T>(); 152e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 153e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman std::stringstream oss; 154e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman oss.precision(gFloatPrecision); 155e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman oss << value; 156e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman str = oss.str(); 157e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return !oss.fail() && !oss.bad(); 158e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} 159e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 160e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <typename srcType, typename dstType> 161e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass Converter; 162e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 163e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <typename dstType> 164e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass Converter<std::string, dstType> 165e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 166e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic: 167e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman static inline bool run(const std::string &str, dstType &result) 168e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman { 169e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return fromString<dstType>(str, result); 170e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 171e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; 172e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 173e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <typename srcType> 174e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass Converter<srcType, std::string> 175e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 176e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic: 177e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman static inline bool run(const srcType &str, std::string &result) 178e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman { 179e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return toString<srcType>(str, result); 180e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 181e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; 182e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 183e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/** Convert a vector by applying convertTo on each element. 184e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 185e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @tparam SrcElem Type of the src elements. 186e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @tparam DstElem Type of the destination elements. 187e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 188e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <typename SrcElem, typename DstElem> 189e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanclass Converter<std::vector<SrcElem>, std::vector<DstElem> > 190e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 191e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanpublic: 192e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman typedef const std::vector<SrcElem> Src; 193e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman typedef std::vector<DstElem> Dst; 194e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 195e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman static inline bool run(Src &src, Dst &dst) 196e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman { 197e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman typedef typename Src::const_iterator SrcIt; 198e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman dst.clear(); 199e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman dst.reserve(src.size()); 200e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman for (SrcIt it = src.begin(); it != src.end(); ++it) { 201e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman DstElem dstElem; 202e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (not convertTo(*it, dstElem)) { 203e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return false; 204e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 205e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman dst.push_back(dstElem); 206e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 207e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return true; 208e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 209e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}; 210e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 211e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} // namespace details 212e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 213e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <typename srcType, typename dstType> 214e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstatic inline bool convertTo(const srcType &input, dstType &result) 215e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 216e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return details::Converter<srcType, dstType>::run(input, result); 217e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} 218e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 219e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/** 220e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Specialization for int16_t of convertTo template function. 221e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 222e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * This function follows the same paradigm than it's generic version. 223e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 224e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * The specific implementation is made necessary because the stlport version of 225e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * string streams is bugged and does not fail when giving overflowed values. 226e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * This specialisation can be safely removed when stlport behaviour is fixed. 227e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 228e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[in] str the string to parse. 229e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[out] result reference to object where to store the result. 230e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 231e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @return true if conversion was successful, false otherwise. 232e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 233e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 234e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramaninline bool convertTo<std::string, int16_t>(const std::string &str, int16_t &result) 235e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 236e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman int64_t res; 237e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 238e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (!convertTo<std::string, int64_t>(str, res)) { 239e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return false; 240e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 241e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 242e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (res > std::numeric_limits<int16_t>::max() || res < std::numeric_limits<int16_t>::min()) { 243e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return false; 244e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 245e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 246e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman result = static_cast<int16_t>(res); 247e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return true; 248e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} 249e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 250e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/** 251e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Specialization for float of convertTo template function. 252e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 253e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * This function follows the same paradigm than it's generic version and is 254e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * based on it but makes furthers checks on the returned value. 255e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 256e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * The specific implementation is made necessary because the stlport conversion 257e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * from string to float behaves differently than GNU STL: overflow produce 258e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * +/-Infinity rather than an error. 259e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 260e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[in] str the string to parse. 261e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[out] result reference to object where to store the result. 262e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 263e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @return true if conversion was successful, false otherwise. 264e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 265e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 266e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramaninline bool convertTo<std::string, float>(const std::string &str, float &result) 267e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 268e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (!details::Converter<std::string, float>::run(str, result)) { 269e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return false; 270e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 271e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 272e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (std::abs(result) == std::numeric_limits<float>::infinity() || 273e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman result == std::numeric_limits<float>::quiet_NaN()) { 274e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return false; 275e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 276e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 277e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return true; 278e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} 279e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 280e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/** 281e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Specialization for double of convertTo template function. 282e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 283e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * This function follows the same paradigm than it's generic version and is 284e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * based on it but makes furthers checks on the returned value. 285e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 286e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * The specific implementation is made necessary because the stlport conversion 287e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * from string to double behaves differently than GNU STL: overflow produce 288e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * +/-Infinity rather than an error. 289e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 290e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[in] str the string to parse. 291e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[out] result reference to object where to store the result. 292e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 293e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @return true if conversion was successful, false otherwise. 294e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 295e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 296e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramaninline bool convertTo<std::string, double>(const std::string &str, double &result) 297e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 298e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (!details::Converter<std::string, double>::run(str, result)) { 299e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return false; 300e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 301e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 302e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (std::abs(result) == std::numeric_limits<double>::infinity() || 303e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman result == std::numeric_limits<double>::quiet_NaN()) { 304e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return false; 305e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 306e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 307e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return true; 308e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} 309e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 310e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/** 311e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Specialization for boolean of convertTo template function. 312e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 313e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * This function follows the same paradigm than it's generic version. 314e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * This function accepts to parse boolean as "0/1" or "false/true" or 315e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * "FALSE/TRUE". 316e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * The specific implementation is made necessary because the behaviour of 317e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * string streams when parsing boolean values is not sufficient to fit our 318e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * requirements. Indeed, parsing "true" will correctly parse the value, but the 319e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * end of stream is not reached which makes the ss.eof() fails in the generic 320e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * implementation. 321e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 322e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[in] str the string to parse. 323e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[out] result reference to object where to store the result. 324e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 325e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @return true if conversion was successful, false otherwise. 326e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 327e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 328e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramaninline bool convertTo<std::string, bool>(const std::string &str, bool &result) 329e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 330e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (str == "0" || str == "FALSE" || str == "false") { 331e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman result = false; 332e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return true; 333e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 334e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 335e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman if (str == "1" || str == "TRUE" || str == "true") { 336e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman result = true; 337e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return true; 338e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman } 339e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 340e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return false; 341e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} 342e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 343e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/** 344e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Specialization for boolean to string of convertTo template function. 345e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 346e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * This function follows the same paradigm than it's generic version. 347e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * This function arbitrarily decides to return "false/true". 348e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * It is compatible with the specialization from string to boolean. 349e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 350e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[in] isSet boolean to convert to a string. 351e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[out] result reference to object where to store the result. 352e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 353e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @return true if conversion was successful, false otherwise. 354e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 355e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 356e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramaninline bool convertTo<bool, std::string>(const bool &isSet, std::string &result) 357e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 358e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman result = isSet ? "true" : "false"; 359e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return true; 360e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} 361e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 362e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/** 363e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Specialization for string to string of convertTo template function. 364e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 365e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * This function is a dummy conversion from string to string. 366e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * In case of clients using template as well, this implementation avoids adding extra 367e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * specialization to bypass the conversion from string to string. 368e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 369e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[in] str the string to parse. 370e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @param[out] result reference to object where to store the result. 371e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * 372e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * @return true if conversion was successful, false otherwise. 373e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */ 374e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramantemplate <> 375e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramaninline bool convertTo<std::string, std::string>(const std::string &str, std::string &result) 376e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman{ 377e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman result = str; 378e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman return true; 379e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} 380e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 381e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} // namespace utilities 382e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman 383e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} // namespace android 384