diff options
Diffstat (limited to 'tools/intergen/utils/include/utils/string_utils.h')
-rw-r--r-- | tools/intergen/utils/include/utils/string_utils.h | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/tools/intergen/utils/include/utils/string_utils.h b/tools/intergen/utils/include/utils/string_utils.h new file mode 100644 index 0000000000..78c1b87aa5 --- /dev/null +++ b/tools/intergen/utils/include/utils/string_utils.h @@ -0,0 +1,161 @@ +/** + * Copyright (c) 2014, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef STRING_UTILS_H_ +#define STRING_UTILS_H_ + +#include <stdint.h> +#include <algorithm> +#include <cassert> +#include <cctype> +#include <functional> +#include <ostream> +#include <sstream> +#include <string> + +/* + * Commonly used string processing functions + */ + +/* + * Stream indentation helper class. Hooks the stream that is + * passed to it's constructor processing all the input to that stream + * and issuing indentation spaces when newline symbol is put to the stream. + * Unhooks from stream on destruction. + */ +class Indent: private std::streambuf { +public: + /* + * Constructs indentation 'sentry' object hooking on |dest| stream. + * |ident_size| is the indentation width (spaces). + */ + explicit Indent(std::ostream& dest, size_t ident_size = 2) + : dest_buf_(dest.rdbuf()), + new_line_started_(true), + ident_(ident_size, ' '), + owner_(&dest) { + owner_->rdbuf(this); + } + ~Indent() { + owner_->rdbuf( dest_buf_ ); + } +private: + virtual int overflow( int ch ) { + if ( new_line_started_ && ch != '\n' ) { + dest_buf_->sputn(ident_.data(), ident_.size()); + } + new_line_started_ = ch == '\n'; + return dest_buf_->sputc(ch); + } +private: + std::streambuf* dest_buf_; + bool new_line_started_; + std::string ident_; + std::ostream* owner_; +}; + +/* + * String to numerical (int, double) conversion function. + * Checks wether |str_val| contains a number and converts + * it to |out_val|. + * Returns false on failure. + */ +template<typename T> +bool StringToNumber(const std::string& str_val, T* out_val) { + assert(out_val); + std::stringstream stream(str_val); + stream>>(*out_val); + return bool(stream); +} + +/* + * Number to string conversion function. + */ +template<typename T> +inline std::string NumberToString(T number) { + std::stringstream stream; + std::string result; + stream<<number; + stream>>result; + return result; +} + +/* + * In-place string trimming function, trims spaces at string beginning + */ +inline std::string& ltrim(std::string &s) { + s.erase( + s.begin(), + std::find_if(s.begin(), s.end(), + std::not1(std::ptr_fun<int, int>(std::isspace)))); + return s; +} + +/* + * In-place string trimming function, trims spaces at string end + */ +inline std::string& rtrim(std::string &s) { + s.erase( + std::find_if(s.rbegin(), s.rend(), + std::not1(std::ptr_fun<int, int>(std::isspace))).base(), + s.end()); + return s; +} + +/* + * In-place string trimming function, trims spaces around text + */ +inline std::string& trim(std::string &s) { + return ltrim(rtrim(s)); +} + +/* + * Converts ASCII string to lowercase + */ +inline std::string to_lower(std::string str) { + for (std::string::iterator i = str.begin(); i != str.end(); ++i) { + *i = std::tolower(*i); + } + return str; +} + +/* + * Converts ASCII string to uppercase + */ +inline std::string to_upper(std::string str) { + for (std::string::iterator i = str.begin(); i != str.end(); ++i) { + *i = std::toupper(*i); + } + return str; +} + +#endif /* STRING_UTILS_H_ */ |