#include "mystring.h"
using namespace std;

ostream &operator<<(ostream &cout, const MyString &str)
{
    cout << str.mStr; // 输出字符串 mStr
    return cout;      // 返回 cout 输出流对象
}
istream &operator<<(istream &cin, MyString &str)
{
    cin >> str.mStr; // 输入字符串 mStr
    return cin;      // 返回 cin 输入流对象
}

MyString::MyString(const char *str)
{
    mSize = strlen(str);        // 计算字符串长度
    mStr = new char[mSize + 1]; // 为 '\0' 留一个位置
    strcpy(mStr, str);          // 拷贝字符串
}

MyString::MyString(const MyString &str)
{
    mSize = str.mSize;             // 拷贝字符串长度
    char *p = new char[mSize + 1]; // 为 '\0' 留一个位置
    strcpy(p, str.mStr);           // 拷贝字符串
    delete[] this->mStr;           // 删除之前的空间
    this->mStr = p;                // 指向新的空间
}

MyString::~MyString()
{
    delete[] mStr; // 释放空间
}

// 字符串拼接
MyString &MyString::operator+(MyString &other)
{
    mSize += other.mSize;          // 计算新的字符串长度, 用原有长度加上 other 的长度
    char *p = new char[mSize + 1]; // 为 '\0' 留一个位置
    strcpy(p, mStr);               // 拷贝 mStr
    strcat(p, other.mStr);         // 拼接 other.mStr
    delete[] this->mStr;           // 删除之前的空间
    this->mStr = p;                // 指向新的空间
}

MyString &MyString::operator+(const char *other)
{
    mSize += strlen(other);        // 计算新的字符串长度, 用原有长度加上 other 的长度
    char *p = new char[mSize + 1]; // 为 '\0' 留一个位置
    strcpy(p, mStr);               // 拷贝 mStr
    strcat(p, other);              // 拼接 other
    delete[] this->mStr;           // 删除之前的空间
    this->mStr = p;                // 指向新的空间
}

// 字符串赋值
MyString &MyString::operator=(MyString &other)
{
    mSize = other.mSize;           // 拷贝字符串长度
    char *p = new char[mSize + 1]; // 为 '\0' 留一个位置
    strcpy(p, other.mStr);         // 拷贝字符串
    delete[] mStr;                 // 删除之前的空间
    mStr = p;                      // 指向新的空间
}

MyString &MyString::operator=(const char *other)
{
    mSize = strlen(other);         // 拷贝字符串长度
    char *p = new char[mSize + 1]; // 为 '\0' 留一个位置
    strcpy(p, other);              // 拷贝字符串
    delete[] mStr;                 // 删除之前的空间
    mStr = p;                      // 指向新的空间
}

// 字符串比较
MyString &operator==(MyString &other)
{
    return strcmp(mStr, other.mStr) == 0; // 比较字符串
}

MyString &operator==(const char *other)
{
    return strcmp(mStr, other) == 0; // 比较字符串
}

// 读取字符串中 index 位置的字符
char MyString::operator[](int index)
{
    cout << "长度: " << mSize << endl;
    // index 支持负数, -1 表示倒数第一个字符
    // index 是负数，计算机存储是补码，如果直接位运算，以补码的方式 & 位运算符
    // 需要手动取反补码（~）, 然后 +1
    int absIndex = (~index + 1) & 0x7fffffff; // 0x7fffffff 是有符号正整数 int 的最大值
    // 0x7fffffff = 0111 1111 1111 1111 1111 1111 1111 1111
}
