stringize.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:3k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file   stringize.h
  3.  * @author Nat Goodspeed
  4.  * @date   2008-12-17
  5.  * @brief  stringize(item) template function and STRINGIZE(expression) macro
  6.  * 
  7.  * $LicenseInfo:firstyear=2008&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2008-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #if ! defined(LL_STRINGIZE_H)
  35. #define LL_STRINGIZE_H
  36. #include <sstream>
  37. #include <boost/lambda/lambda.hpp>
  38. /**
  39.  * stringize(item) encapsulates an idiom we use constantly, using
  40.  * operator<<(std::ostringstream&, TYPE) followed by std::ostringstream::str()
  41.  * to render a string expressing some item.
  42.  */
  43. template <typename T>
  44. std::string stringize(const T& item)
  45. {
  46.     std::ostringstream out;
  47.     out << item;
  48.     return out.str();
  49. }
  50. /**
  51.  * stringize_f(functor)
  52.  */
  53. template <typename Functor>
  54. std::string stringize_f(Functor const & f)
  55. {
  56.     std::ostringstream out;
  57.     f(out);
  58.     return out.str();
  59. }
  60. /**
  61.  * STRINGIZE(item1 << item2 << item3 ...) effectively expands to the
  62.  * following:
  63.  * @code
  64.  * std::ostringstream out;
  65.  * out << item1 << item2 << item3 ... ;
  66.  * return out.str();
  67.  * @endcode
  68.  */
  69. #define STRINGIZE(EXPRESSION) (stringize_f(boost::lambda::_1 << EXPRESSION))
  70. /**
  71.  * destringize(str)
  72.  * defined for symmetry with stringize
  73.  * *NOTE - this has distinct behavior from boost::lexical_cast<T> regarding
  74.  * leading/trailing whitespace and handling of bad_lexical_cast exceptions
  75.  */
  76. template <typename T>
  77. T destringize(std::string const & str)
  78. {
  79. T val;
  80.     std::istringstream in(str);
  81. in >> val;
  82.     return val;
  83. }
  84. /**
  85.  * destringize_f(str, functor)
  86.  */
  87. template <typename Functor>
  88. void destringize_f(std::string const & str, Functor const & f)
  89. {
  90.     std::istringstream in(str);
  91.     f(in);
  92. }
  93. /**
  94.  * DESTRINGIZE(str, item1 >> item2 >> item3 ...) effectively expands to the
  95.  * following:
  96.  * @code
  97.  * std::istringstream in(str);
  98.  * in >> item1 >> item2 >> item3 ... ;
  99.  * @endcode
  100.  */
  101. #define DESTRINGIZE(STR, EXPRESSION) (destringize_f((STR), (boost::lambda::_1 >> EXPRESSION)))
  102. #endif /* ! defined(LL_STRINGIZE_H) */