#ifndef _folderP_h_
#define _folderP_h_ 1

#include "sysdep.h"
#include "memory.h"
#include "foldt.h"
#include "folder.h"

/* It might be a good idea to cache the folder handler procedures here
 * for efficiency, but not worth the trouble for now */

typedef struct AlFolder_st {
  AlFoldT type;			/* the folder type object */
  AlFoldT_FoldObj the_folder;	/* the actual folder object */
} AlFolder_rep;

typedef struct AlFolderIter_st {
  AlFolder the_folder;		/* the folder being iterated */
  AlFoldT_IterObj the_iter;	/* the actual iterator object */
} AlFolderIter_rep;

#define raise(p_to_rep) ((AlFolder)p_to_rep)
#define lower(obj) ((AlFolder_rep *)obj)
#define create() ((AlFolder_rep *)Memory_allocate(sizeof(AlFolder_rep)))
#define destroy(p_to_rep) (Memory_free((VOIDP)p_to_rep))

#define raise_iter(p_to_rep) ((AlFolderIter)p_to_rep)
#define lower_iter(obj) ((AlFolderIter_rep *)obj)
#define create_iter() ((AlFolderIter_rep *)Memory_allocate(sizeof(AlFolderIter_rep)))
#define destroy_iter(p_to_rep) (Memory_free((VOIDP)p_to_rep))

#endif
