/**
* @file kcpp_throwable.h
* @brief Kantan C++ Library Throwable ヘッダファイル。
* @copyright 2001 - 2024 Nomura Kei
* @depends
* kcpp_object.hpp
*/
#ifndef KCPP_THROWABLE_HPP
#define KCPP_THROWABLE_HPP
#include <kcpp_object.hpp>
namespace kcpp
{
class Throwable : public Object
{
public:
// デフォルトコンストラクタ
Throwable(const String &str = String()) noexcept;
// コピーコンストラクタ
Throwable(const String &str) noexcept;
// ムーブコンストラクタ
Throwable(String &&str) noexcept;
// デストラクタ
~Throwable() noexcept;
// コピー代入演算子
String &operator=(const String &other) noexcept;
// ムーブ代入演算子
String &operator=(String &&obj) noexcept;
// 文字列長を返す。
int length() const noexcept;
// 指定された位置の文字を返す。
char charAt(int index) const;
// 部分文字列を返す。
String substring(int beginIndex, int endIndex) const;
// 指定文字列が含まれるかい否かを返す。
bool contains(const String &str) const noexcept;
// 文字置換
String replace(char oldChar, char newChar) const noexcept;
// 文字列置換
String replace(const String ®ex, const String &replacement) const;
// 文字列置換
String replaceAll(const String ®ex, const String &replacement) const;
// 分割
std::unique_ptr<String[]> split(const String ®ex) const noexcept;
// 先頭の文字列が一致するか
bool startsWith(const String &prefix) const noexcept;
// 末尾の文字列が一致するか
bool endsWith(const String &suffix) const noexcept;
// 小文字変換
String toLowerCase() const noexcept;
// 大文字変換
String toUpperCase() const noexcept;
// trim
String trim() const noexcept;
// 文字列表現取得
String toString() const noexcept override;
// 比較
bool equals(const Object &obj) const noexcept override;
// ハッシュコード
int hashCode() const noexcept override;
// クローン
std::unique_ptr<Object> clone() const noexcept override;
// 出力用
friend std::ostream &operator<<(std::ostream &os, const String &str);
// 入力用
friend std::istream &operator>>(std::istream &is, String &str);
protected:
// 値
std::unique_ptr<char[]> value;
// 文字列の長さ
int len;
// データ設定関数
void setValue(const char *str);
};
} // namespace kcpp
#endif // KCPP_STRING_HPP