Newer
Older
c-interpreter / include / kc_list_multi.h
Nomura Kei on 9 Aug 2023 5 KB UPDATE
/**
 * @file kc_list_multi.h
 * @brief List Multi モジュールヘッダファイル
 */
#ifndef KC_LIST_MULTI_H
#define KC_LIST_MULTI_H

#include <kc.h>


////////////////////////////////////////////////////////////////////////////////
//
// KcListMulti
//

/**
 * 複数種類の要素を扱うことが可能なリスト。
 */
typedef struct KcListMulti_
{

	/**
	 * 対象リスト内にある要素の数を返します。
	 *
	 * @param list 対象リスト
	 * @return 対象リスト内の要素数
	 *//
	int (*size)(struct KcListMulti_* list);


	/**
	 * 対象リストに要素がない場合に true を返します。
	 *
	 * @param list 対象リスト
	 * @return 対象リストに要素が含まれていない場合は true
	 */
	bool (*is_empty)(struct KcListMulti_* list);


	/**
	 * 指定の要素が対象リストに含まれている場合に true を返します。
	 *
	 * @param list  対象リスト
	 * @param element 対象リスト内にあるかどうか判定される要素
	 * @param size    element のサイズ
	 * @return 指定された要素が対象リスト内にある場合は true
	 */
	bool (*contains)(struct KcListMulti_* list, const void element, size_t size);


	/**
	 * 対象リスト内の指定された位置に、指定された要素を挿入します。
	 * その位置の現在の要素(ある場合)とそれ以降の要素を右に移動します。(インデックスに1を加算)。
	 * 要素はコピーされて格納されます。
	 *
	 * @param list    対象リスト
	 * @param index   指定の要素が挿入される位置のインデックス
	 * @param element 挿入される要素
	 * @param size    挿入される要素のサイズ
	 * @return true/false (格納成功/失敗)
	 */
	bool (*add)(struct KcListMulti_* list, int index, const void* element, size_t size); 


	/**
	 * 対象リスト内の指定された位置にある要素を削除します。
	 * 後続の要素を左に移動します(インデックスから1を減算)。
	 * element が NULL でない場合、削除された要素のコピーが、element に格納されます。
	 *
	 * @param list    対象リスト
	 * @param index   削除される要素のインデックス
	 * @param element 削除された要素をコピーが格納されます。
	 * @param size    element のサイズを指定します。削除に成功した場合、削除した要素のサイズが格納されます。
	 * @return true/false (削除成功/失敗)
	 */
	bool (*remove)(struct KcListMulti_* list, int index, void* element, size_t* size);


	/**
	 * 指定された comparator が示す順序に従って、対象リストをソートします。
	 *
	 * @param list       対象リスト
	 * @param comparator リスト要素を比較するために使用される comparator 
	 */
	void (*sort)(struct KcListMulti_* list,
			int (*comparator)(const void* element1, size_t size1, const void* element2, size_t size2));


	/**
	 * すべての要素を対象リストから削除します。
	 *
	 * @param list 対象リスト
	 */
	void (*clear)(struct KcListMulti_* list);


	/**
	 * 対象リスト内の指定された位置にある要素を返します。
	 *
	 * @param list  対象リスト
	 * @param size  対象リスト内の指定された位置にある要素のサイズが格納されます。
	 * @return 対象リスト内の指定された位置にある要素
	 */
	void* (*get)(struct KcListMulti_* list, size_t* size);


	/**
	 * 対象リスト内の指定された位置にある要素を、指定された要素に置き換えます。
	 *
	 * @param list        対象リスト
	 * @param index       置換される要素のインデックス
	 * @param element     指定された位置に格納される要素
	 * @param size        指定された位置に格納される要素のサイズ
	 * @param org_element 指定された位置に以前あった要素のコピーが格納されます。
	 * @param org_size    org_element のサイズを指定します。
	 *                    置換に成功した場合、指定された位置に以前あった要素のサイズが格納されます。
	 * @return true/false (置換成功/失敗)
	 */
	bool (*set)(struct KcListMulti_* list, int index, const void* element, size_t size,
			void* org_element, size_t* org_size);


	/**
	 * 指定された要素がこのリスト内で最初に検出された位置のインデックスを返します。
	 * 指定された要素がこのリストにない場合は -1 を返します。
	 *
	 * @param list    対象リスト
	 * @param element 検索する要素
	 * @param size    検索する要素のサイズ
	 * @return 指定された要素がこのリスト内で最初に検出された位置のインデックス
	 */
	int (*index_of)(struct KcListMulti_* list, const void* element, size_t size); 


	/**
	 * 指定された要素がこのリスト内で最後に検出された位置のインデックスを返します。
	 * 指定された要素がこのリストにない場合は -1 を返します。
	 *
	 * @param list    対象リスト
	 * @param element 検索する要素
	 * @param size    検索する要素のサイズ
	 * @return 指定された要素がこのリスト内で最後に検出された位置のインデックス
	 */
	int (*last_index_of)(struct KcListMulti_* list, const void* element, size_t size);


	/**
	 * このリスト内の指定された位置で始まる、リスト内の要素を反復するイテレータを返します。
	 *
	 * @param list    対象リスト
	 * @param index   イテレータから返される最初の要素のインデックス
	 * @return リスト内の指定された位置で始まる、リスト内の要素を反復するイテレータ
	 */
	KcIterator* (*iterator)(struct KcListMulti_* list, int index);


	/**
	 * リスト管理情報
	 * 本オブジェクトはリスト実装者が利用するための情報へのポインタとなります。
	 */
	void* _info;

} KcListMulti;



#endif	// KC_LIST_MULTI_H