41 lines
1.1 KiB
C
41 lines
1.1 KiB
C
|
#pragma once
|
||
|
#include <iostream>
|
||
|
#include "StringValue.h"
|
||
|
|
||
|
|
||
|
|
||
|
/* Design decisions:
|
||
|
* - Everything related to ref-counting is the responsibility of the StringValue class
|
||
|
* - Anything dynamically allocated is owned (and thus once deleted) by the StringValue class
|
||
|
* (including itself -- this is possible because of the reference counting mechanism) */
|
||
|
class String
|
||
|
{
|
||
|
private:
|
||
|
|
||
|
StringValue* _str;
|
||
|
|
||
|
public:
|
||
|
|
||
|
String();
|
||
|
String(const char*);
|
||
|
String(const String&);
|
||
|
String& operator=(String);
|
||
|
String(String&&);
|
||
|
~String();
|
||
|
|
||
|
friend void swap(String&, String&) noexcept;
|
||
|
String operator+(const String&) const;
|
||
|
String& operator+=(const String&);
|
||
|
String operator+(char) const;
|
||
|
String& operator+=(char);
|
||
|
bool operator==(const String&) const;
|
||
|
const char& operator[](size_t) const;
|
||
|
char& operator[](size_t);
|
||
|
|
||
|
size_t size() const; // does not include null-terminator
|
||
|
const char* c_str() const;
|
||
|
|
||
|
friend std::istream& operator>>(std::istream&, String&);
|
||
|
};
|
||
|
|
||
|
std::ostream& operator<<(std::ostream&, const String&);
|