Facebook
From Edgy Mockingjay, 11 Months ago, written in C++.
Embed
Download Paste or View Raw
Hits: 118
  1. #ifndef __FORMAT_H
  2. #define __FORMAT_H
  3.  
  4. #include <string>
  5. #include <sstream>
  6.  
  7. #include <Core/Utils/Exceptions/LogicError.h>
  8.  
  9. namespace Strings
  10. {
  11.  
  12. namespace Detail
  13. {
  14.  
  15. inline std::string getIdentifier(int index)
  16. {
  17.         return std::string("%") + std::to_string(index) + "%";
  18. }
  19.  
  20. template<typename T>
  21. std::string format(const std::string& str, int index,  T value)
  22. {
  23.         auto tmpStr = str;
  24.         auto identifier = getIdentifier(index);
  25.        
  26.         auto pos = tmpStr.find(identifier);
  27.         if (pos == std::string::npos)
  28.                 throw LogicError("Strings::format: more variables than placeholders");
  29.  
  30.  
  31.         while (pos != std::string::npos)
  32.         {
  33.                 std::stringstream ss;
  34.                 ss << tmpStr.substr(0, pos) << value << tmpStr.substr(pos + 3);
  35.                 tmpStr = ss.str();
  36.  
  37.                 pos = tmpStr.find(identifier);
  38.         }
  39.  
  40.         return tmpStr;
  41. }
  42.  
  43. template<typename T, typename... TArgs>
  44. std::string format(const std::string& str, int index,  T value, TArgs... args)
  45. {
  46.         auto tmpStr = format (str, index, value);
  47.         return format(tmpStr, index + 1, args...);
  48. }
  49.  
  50. } // namespace Detail
  51.  
  52. inline std::string format(const std::string& str)
  53. {
  54.         return str;
  55. }
  56.  
  57. template <typename... TArtgs>
  58. std::string format(const std::string& str, TArtgs... targs)
  59. {
  60.         return Detail::format(str, 1, targs...);
  61. }
  62.  
  63. } // namespace Strings
  64.  
  65. #endif // __FORMAT_H
  66.