/*
 ******************************************************************************
 * File: util_slst.h
 *
 * # Hist: 
 *          Date;           Author;         Description
 *          30 Oct. 2017;   Chen, George;   file creation, transported from prtos
 ******************************************************************************
 */
#ifndef __LIST_SLST_H__
#define __LIST_SLST_H__

/*
 ******************************************************************************
 * Includes
 ******************************************************************************
 */
//#include "../comn/comn_cfgs.h"


#ifdef __cplusplus
extern "C" {
#endif

/* #######################  Single Linked List Types  ####################### */
/* 
 * USAGE
 * refer to util_dlst.h
 */
typedef enum list_slst_enum_snod_def {
    list_slst_enum_snod_lin = 0,
    list_slst_enum_snod_cir,
} list_snod_e;

typedef struct list_slst_stru_snod_def {
	struct list_slst_stru_snod_def* next;	// next node
} list_snod_t;

/* slist types definitions */
typedef struct list_slst_stru_slst_def {
    list_snod_t*    head;   // [set by sys] head node
    list_snod_t*    tail;   // [set by sys] tail node
    list_snod_t*    iter;   // [set by sys] node iterator
    unsigned int    coun;   // [set by sys] counts of entity
} list_slst_t;

typedef struct list_slst_stru_sque_def {
    list_slst_t     list;
    list_snod_t*    post;   // [set by sys] head node to pop out
    list_snod_t*    pend;   // [set by sys] tail node to push in
    unsigned int    coun;   // [set by sys] counts of records
} list_sque_t;

/* ########################## function prototypes  ########################## */
/*
 * # Name:  util_slst_ini
 * # Desc:  initialize single linked list
 * # Para:  node: list being initialized
 * # return:node
 */
signed int
list_snod_ini(list_snod_t* snod, list_snod_e type);

// signed int
// list_snod_ini_lin(list_snod_t* snod);

// signed int
// list_snod_ini_cir(list_snod_t* snod);

// /*
//  * # Name:  util_slst_ins_aft
//  * # Desc:  insert node after a list, link member pointers each other
//  * # Para:  slist1: list to which new list being put after
//  *          slist2: list which being put after a list
//  * # return:slist1
//  */
// signed int
// list_snod_ins_aft(list_snod_t* nod0, list_snod_t* nod1);

// /*
//  * # Name:  util_slst_rmv_aft
//  * # Desc:  remove a node after a list.
//  * # Para:  slist: list after which a node being removed.
//  * # return:slist
//  */
// signed int
// list_snod_rmv_aft(list_snod_t* snod);

/*
 * # Name:  list_slst_ini
 * # Desc:  initialize a single linked list.
 * # Para:  slst: .
 * # rslt:  0 failure otherwise success.
 */
signed int
list_slst_ini(list_slst_t* slst);

/*
 * # Name:  list_slst_add
 * # Desc:  add node to list tail.
 * # Para:  slst: .
 *          snod:
 * # rslt:  0 failure otherwise success.
 */
signed int
list_slst_add(list_slst_t* slst, list_snod_t* snod);

/*
 * # Name:  list_slst_rmv
 * # Desc:  search & remove node in list.
 * # Para:  slst: .
 *          node:
 * # rslt:  0 failure otherwise success.
 */
signed int
list_slst_rmv(list_slst_t* slst, list_snod_t* snod);

/*
 * # Name:  list_slst_has
 * # Desc:  check if the list contains the node.
 * # Para:  list: list .
 *			node: node .
 * # return:TRUE sucess, otherwise FALSE.
 */
signed int
list_slst_has(list_slst_t* slst, const list_snod_t* snod);

/*
 * # Name:  list_dlst_emu
 * # Desc:  iterates each node.
 * # Para:  list:
 * # return:num of nodes
 */
signed int
list_slst_emu(list_slst_t* slst);

/*
 * # Name:  list_dlst_nxt
 * # Desc:  get iterated node.
 * # Para:  list:
 * # return:num of nodes
 */
list_snod_t*
list_slst_nxt(list_slst_t* slst);

/*
 * # Name:  list_sque_ini
 * # Desc:  initialize single linked list queue.
 * # Para:  list:
 * # return:num of nodes
 */
signed int
list_sque_ini(list_sque_t* sque);

/*
 * # Name:  util_slst_fsh
 * # Desc:  reset queue.
 * # Para:  list: list should be operated on.
 * # return:TRUE sucess, otherwise FALSE.
 */
signed int
list_sque_fsh(list_sque_t* sque);

signed int
list_sque_pop(list_sque_t* sque, void* data, unsigned int size);

signed int
list_sque_psh(list_sque_t* sque, void* data, unsigned int size);

#ifdef __cplusplus
}
#endif

#endif	// __UTIL_SLST_H__