memgraph/include/utils/string/weak_string.hpp
2016-08-10 09:39:02 +01:00

86 lines
1.5 KiB
C++

#pragma once
#include <cstring>
#include <cassert>
#include <string>
#include "utils/total_ordering.hpp"
#include "utils/total_ordering_with.hpp"
class WeakString
{
public:
constexpr WeakString() : str(nullptr), len(0) {}
WeakString(const std::string& str) : str(str.c_str()), len(str.size()) {}
WeakString(const char* str) : str(str), len(strlen(str)) {}
constexpr WeakString(const char* str, size_t len) : str(str), len(len) {}
const char& operator[](size_t idx) const
{
assert(idx < len);
return str[idx];
}
const char& front() const
{
assert(len > 0);
return str[0];
}
const char& back() const
{
assert(len > 0);
return str[len - 1];
}
const char* data() const
{
return str;
}
bool empty() const
{
return len == 0;
}
size_t size() const
{
return len;
}
size_t length() const
{
return size();
}
std::string to_string() const
{
return std::string(str, len);
}
friend bool operator==(const WeakString& lhs, const WeakString rhs)
{
// oh dear god, make this better with custom iterators
if(lhs.size() != rhs.size())
return false;
for(size_t i = 0; i < lhs.size(); ++i)
if(lhs[i] != rhs[i])
return false;
return true;
}
friend bool operator!=(const WeakString& lhs, const WeakString& rhs)
{
return !(lhs == rhs);
}
private:
const char* str;
size_t len;
};