#ifndef __DISPATCHOP_H__
#define __DISPATCHOP_H__

struct dispatchop {
  /* Looks like a LOGOP */
  BASEOP
  OP *op_first; /* Probably not used */
  OP *op_other;

  /* Extra fields */
  size_t n_cases;
  SV **values;
  OP **dispatch;
};
typedef struct dispatchop DISPATCHOP;

#define cDISPATCHOP      ((DISPATCHOP *)PL_op)
#define cDISPATCHOPx(o)  ((DISPATCHOP *)o)

#define alloc_DISPATCHOP()  MY_alloc_DISPATCHOP(aTHX)
static DISPATCHOP *MY_alloc_DISPATCHOP(pTHX)
{
  OP *o;
  NewOpSz(1101, o, sizeof(DISPATCHOP));
  o->op_flags = 0;
  o->op_private = 0;
  o->op_targ = 0;
  o->op_next = NULL;
#if HAVE_PERL_VERSION(5,26,0)
  o->op_sibparent = NULL;
#else
  o->op_sibling = NULL;
#endif

  return (DISPATCHOP *)o;
}

/* A convenient macro for the start of pp_dispatch_* functions */
#define dDISPATCH \
  size_t n_cases = cDISPATCHOP->n_cases; \
  SV **values    = cDISPATCHOP->values;  \
  OP **dispatch  = cDISPATCHOP->dispatch;

#endif