2
0

string_stream.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 <stdio.h>
  7. #include "container_types.h"
  8. #include "string_utils.h"
  9. #include "os.h"
  10. namespace crown
  11. {
  12. /// Stream of characters.
  13. typedef Array<char> StringStream;
  14. /// Functions to operate on StringStream.
  15. namespace string_stream
  16. {
  17. /// Appends @a val to the stream @a s using appropriate formatting.
  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, int16_t val)
  35. {
  36. return stream_printf(s, "%hd", val);
  37. }
  38. inline StringStream& operator<<(StringStream& s, uint16_t val)
  39. {
  40. return stream_printf(s, "%hu", val);
  41. }
  42. inline StringStream& operator<<(StringStream& s, int32_t val)
  43. {
  44. return stream_printf(s, "%d", val);
  45. }
  46. inline StringStream& operator<<(StringStream& s, uint32_t val)
  47. {
  48. return stream_printf(s, "%u", val);
  49. }
  50. inline StringStream& operator<<(StringStream& s, int64_t val)
  51. {
  52. return stream_printf(s, "%lld", val);
  53. }
  54. inline StringStream& operator<<(StringStream& s, uint64_t val)
  55. {
  56. return stream_printf(s, "%llu", val);
  57. }
  58. inline StringStream& operator<<(StringStream& s, float val)
  59. {
  60. return stream_printf(s, "%g", val);
  61. }
  62. inline StringStream& operator<<(StringStream& s, double val)
  63. {
  64. return stream_printf(s, "%g", val);
  65. }
  66. inline StringStream& operator<<(StringStream& s, const char* string)
  67. {
  68. array::push(s, string, strlen(string));
  69. return s;
  70. }
  71. inline const char* c_str(StringStream& s)
  72. {
  73. array::push_back(s, '\0');
  74. array::pop_back(s);
  75. return array::begin(s);
  76. }
  77. template <typename T>
  78. inline StringStream& stream_printf(StringStream& s, const char* format, T& val)
  79. {
  80. char buf[32];
  81. snprintf(buf, 32, format, val);
  82. return s << buf;
  83. }
  84. } // namespace string_stream
  85. } // namespace crown