-/* 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. */
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()
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;
// Capacity
size_t size() const { return str.len; }
size_t length() const { return str.len; }
- bool empty() const { return str.len != 0; }
+ bool empty() const { return str.len == 0; }
void shrink_to_fit() { /* Being there, but doing nothing */}
// Element access
return data()[i];
}
// Conversion
- static string_data& to_string_data(string& s) { return s.str; }
+ static const string_data& to_string_data(const string& s) { return s.str; }
operator std::string() const { return std::string(this->c_str(), this->size()); }
// Iterators
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