#ifndef __BTREE_PRIVATE_H__
#define __BTREE_PRIVATE_H__ 1

#include "udi_common.h"

// Do not kown where it is defined but I need it
extern int Yap_page_size;
#define MAXCARD (int)((Yap_page_size-(2*sizeof(int)))/ (2 * sizeof(void*)))
#define MINCARD (MAXCARD / 2)

struct Branch
{
  double key;
  void * child;
  /*This B+Tree will allways hold index_t both in branches and leaves*/
};
typedef struct Branch branch_t;

struct Node
{
  int count;
  int level;

//  double key[MAXCARD - 1];
//  void * branch[MAXCARD];

  /* we do not use one key with this representation */
  branch_t branch[FLEXIBLE_SIZE];
  /* in leaf nodes last child is ptr to next node
   * for fast in order run
   */
};
typedef struct Node * node_t;
#define SIZEOF_NODE SIZEOF_FLEXIBLE(struct Node, branch, MAXCARD)

struct Range
{
  double min;
  int le;
  double max;
  int ge;
};
typedef struct Range range_t;

typedef node_t btree_t;

static node_t BTreeNewNode (void);
static void BTreeNodeInit (node_t);
static int BTreeInsertNode(node_t, double *, void **);
static int BTreePickBranch(node_t, double);
static int BTreeAddBranch(node_t, int, double *, void **);
static int BTreeAddLeaf(node_t, double *, void **);
static void BTreeDestroyNode (node_t n);

#include "b+tree.h"

#endif /* __BTREE_PRIVATE_H__ */