string_stream.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright (c) 2012-2014 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #pragma once
  6. #include "array.h"
  7. #include "string_utils.h"
  8. #include <stdio.h>
  9. namespace crown
  10. {
  11. /// Stream of characters.
  12. typedef Array<char> StringStream;
  13. /// Functions to operate on StringStream.
  14. namespace string_stream
  15. {
  16. /// Appends @a val to the stream @a s using appropriate formatting.
  17. StringStream& operator<<(StringStream& s, char ch);
  18. StringStream& operator<<(StringStream& s, int16_t val);
  19. StringStream& operator<<(StringStream& s, uint16_t val);
  20. StringStream& operator<<(StringStream& s, int32_t val);
  21. StringStream& operator<<(StringStream& s, uint32_t val);
  22. StringStream& operator<<(StringStream& s, int64_t val);
  23. StringStream& operator<<(StringStream& s, uint64_t val);
  24. StringStream& operator<<(StringStream& s, float val);
  25. StringStream& operator<<(StringStream& s, double val);
  26. /// Appends the string @a string to the stream @a s.
  27. StringStream& operator<<(StringStream& s, const char* string);
  28. /// Returns the stream as a NULL-terminated string.
  29. const char* c_str(StringStream& s);
  30. template <typename T> StringStream& stream_printf(StringStream& s, const char* format, T& val);
  31. } // namespace string_stream
  32. namespace string_stream
  33. {
  34. inline StringStream& operator<<(StringStream& s, char ch)
  35. {
  36. array::push_back(s, ch);
  37. return s;
  38. }
  39. inline StringStream& operator<<(StringStream& s, int16_t val)
  40. {
  41. return stream_printf(s, "%hd", val);
  42. }
  43. inline StringStream& operator<<(StringStream& s, uint16_t val)
  44. {
  45. return stream_printf(s, "%hu", val);
  46. }
  47. inline StringStream& operator<<(StringStream& s, int32_t val)
  48. {
  49. return stream_printf(s, "%d", val);
  50. }
  51. inline StringStream& operator<<(StringStream& s, uint32_t val)
  52. {
  53. return stream_printf(s, "%u", val);
  54. }
  55. inline StringStream& operator<<(StringStream& s, int64_t val)
  56. {
  57. return stream_printf(s, "%lld", val);
  58. }
  59. inline StringStream& operator<<(StringStream& s, uint64_t val)
  60. {
  61. return stream_printf(s, "%llu", val);
  62. }
  63. inline StringStream& operator<<(StringStream& s, float val)
  64. {
  65. return stream_printf(s, "%g", val);
  66. }
  67. inline StringStream& operator<<(StringStream& s, double val)
  68. {
  69. return stream_printf(s, "%g", val);
  70. }
  71. inline StringStream& operator<<(StringStream& s, const char* string)
  72. {
  73. array::push(s, string, strlen(string));
  74. return s;
  75. }
  76. inline const char* c_str(StringStream& s)
  77. {
  78. array::push_back(s, '\0');
  79. array::pop_back(s);
  80. return array::begin(s);
  81. }
  82. template <typename T>
  83. inline StringStream& stream_printf(StringStream& s, const char* format, T& val)
  84. {
  85. char buf[32];
  86. snprintf(buf, 32, format, val);
  87. return s << buf;
  88. }
  89. } // namespace string_stream
  90. } // namespace crown