-/* Copyright (c) 2015-2017. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2015-2019. 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. */
#ifndef SIMGRID_XBT_STRING_HPP
#define SIMGRID_XBT_STRING_HPP
-#include <simgrid_config.h>
+#include <simgrid/config.h>
#include <cstdarg>
#include <cstdlib>
* * the [C++11-conforming implementation](https://gcc.gnu.org/gcc-5/changes.html)
* does not use refcouting/COW but has a small string optimization.
*/
-XBT_PUBLIC_CLASS string : private string_data {
- static const char NUL;
+class XBT_PUBLIC string : private string_data {
+ static char NUL;
+
public:
// Types
typedef std::size_t size_type;
- typedef std::ptrdiff_t difference_type;
typedef char& reference;
typedef const char& const_reference;
- typedef char* pointer;
- typedef const char* const_pointer;
typedef char* iterator;
typedef const char* const_iterator;
{
if (size == 0) {
string_data::len = 0;
- string_data::data = const_cast<char*>(&NUL);
+ string_data::data = &NUL;
} else {
string_data::len = size;
string_data::data = new char[string_data::len + 1];
string_data::data[string_data::len] = '\0';
}
}
- string() : string (const_cast<char*>(&NUL), 0) {}
- string(const char* s) : string(s, strlen(s)) {}
+ 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)
{
string_data::len = s.string_data::len;
string_data::data = s.string_data::data;
s.string_data::len = 0;
- s.string_data::data = const_cast<char*>(&NUL);
+ s.string_data::data = &NUL;
}
- string(std::string const& s) : string(s.c_str(), s.size()) {}
+ explicit string(std::string const& s) : string(s.c_str(), s.size()) {}
// Assign
void assign(const char* s, size_t size)
}
string& operator=(string const& s)
{
- assign(s.c_str(), s.size());
+ if (this != &s)
+ assign(s.c_str(), s.size());
return *this;
}
string& operator=(std::string const& s)
bool empty() const { return len != 0; }
void shrink_to_fit() { /* Being there, but doing nothing */}
- // Alement access
+ // Element access
char* data() { return string_data::data; }
const char* data() const { return string_data::data; }
char* c_str() { return string_data::data; }
void clear()
{
string_data::len = 0;
- string_data::data = const_cast<char*>(&NUL);
+ string_data::data = &NUL;
}
bool equals(const char* data, std::size_t len) const
*
* @ingroup XBT_str
*/
-std::string string_printf(const char *fmt, ...);
+XBT_PUBLIC std::string string_printf(const char* fmt, ...);
/** Create a C++ string from a C-style format
*
* @ingroup XBT_str
*/
-std::string string_vprintf(const char *fmt, va_list ap);
-
+XBT_PUBLIC std::string string_vprintf(const char* fmt, va_list ap);
}
}