Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Update copyright lines.
[simgrid.git] / include / xbt / string.hpp
index 99520e6..83e2820 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2020. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2015-2021. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 namespace simgrid {
 namespace xbt {
 
+/** Create a C++ string from a C-style format
+ *
+ * @ingroup XBT_str
+ */
+XBT_PUBLIC std::string string_printf(const char* fmt, ...);
+
+/** Create a C++ string from a C-style format
+ *
+ * @ingroup XBT_str
+ */
+XBT_PUBLIC std::string string_vprintf(const char* fmt, va_list ap);
+
 #if SIMGRID_HAVE_MC
 
 /** POD structure representation of a string
@@ -60,11 +72,11 @@ class XBT_PUBLIC string {
 
 public:
   // Types
-  typedef std::size_t size_type;
-  typedef char& reference;
-  typedef const char& const_reference;
-  typedef char* iterator;
-  typedef const char* const_iterator;
+  using size_type       = std::size_t;
+  using reference       = char&;
+  using const_reference = const char&;
+  using iterator        = char*;
+  using const_iterator  = const char*;
 
   // Dtor
   ~string()
@@ -89,7 +101,7 @@ public:
   string() : string(&NUL, 0) {}
   explicit string(const char* s) : string(s, strlen(s)) {}
   string(string const& s) : string(s.c_str(), s.size()) {}
-  string(string&& s) noexcept : str(std::move(s.str))
+  string(string&& s) noexcept : str(s.str)
   {
     s.str.len  = 0;
     s.str.data = &NUL;
@@ -181,6 +193,15 @@ public:
     str.data = &NUL;
   }
 
+  size_t copy(char* s, size_t len, size_t pos = 0) const
+  {
+    if (pos > str.len)
+      throw std::out_of_range(string_printf("xbt::string::copy with pos > size() (%zu > %zu)", pos, str.len));
+    size_t count = std::min(len, str.len - pos);
+    std::copy_n(str.data + pos, count, s);
+    return count;
+  }
+
   bool equals(const char* data, std::size_t len) const
   {
     return this->size() == len
@@ -292,18 +313,6 @@ bool operator>=(std::string const& a, string const& b)
 typedef std::string string;
 
 #endif
-
-/** Create a C++ string from a C-style format
- *
- * @ingroup XBT_str
-*/
-XBT_PUBLIC std::string string_printf(const char* fmt, ...);
-
-/** Create a C++ string from a C-style format
- *
- * @ingroup XBT_str
-*/
-XBT_PUBLIC std::string string_vprintf(const char* fmt, va_list ap);
 }
 }