#ifndef STRING_MANAGER_H
#define STRING_MANAGER_H

#include <stddef.h>
#include <stdbool.h>


#ifdef __cplusplus
extern "C" {
#endif



/**
 * 文字列を管理します.
 * create関数にて渡された文字列をコピー&管理します.
 * 管理した文字列は, clean 関数にて破棄できます.
 */
typedef struct StringManager_
{
	/**
	 * 指定された文字列を管理します.
	 * 指定された文字列は管理領域にコピーされ,
	 * 管理された文字列へのポインタを返します.
	 *
	 * @param[in,out] sm  文字列管理
	 * @param[in]     str 管理に加える文字列
	 * @return 加えられた文字列
	 */
	char*  (*create)(struct StringManager_* const sm, const char* const str);

	/**
	 * 管理している文字列をクリアします.
	 *
	 * @param[in,out] sm 文字列管理
	 */
	void   (*clean )(struct StringManager_* const sm);

	int    size;		///< 現在の使用データサイズ.
	size_t capacity;	///< 文字列管理データ容量.
	bool   isAutoExt;	///< サイズ自動拡張有効/無効.
	char*  data;		///< 文字列管理データ.
} StringManager;


StringManager* StringManager_new(const size_t cap, const bool ext);
void           StringManager_delete(StringManager* const sm);



#ifdef __cplusplus
}
#endif

#endif	/* STRING_MANAGER_H	*/
