#ifndef RTREGISTER_H
#define RTREGISTER_H

/******************************************************************************/
/******************************************************************************/
/*****************     Copyright 2004, 2005 Chronolytics Inc.   ***************/
/*****************     All Rights Reserved                      ***************/
/******************************************************************************/
/******************************************************************************/
#include <RTClock.h>
#include <RTEvent.h>
#include <RTReactiveTask.h>
#include <RTMagic.h>

typedef void RTRegister;  /* opaque type of class */
/*
**  Data type as void *
*/
typedef void RTRegister_Data;
typedef void RTObserver;

typedef struct {
   RTMagic magic;
   const char *reg_name;
   RTClockCount reg_ticks;
   size_t size;  /* size of object */
   RTRegister_Data *reg_data;
} RTRegister_Update;

static volatile const char __attribute__ ((unused)) rcsid_RTREGISTER_H[] = "$Id: RTRegister.h,v 1.9 2005/07/08 03:10:52 dave Exp $";

#define RTRegister_Update_MAGIC MAGIC("RgUp")
#define RTObserver_MAGIC MAGIC("Lstn")

/* private type magic */
#define RTRegister_MAGIC MAGIC("Regr")


RTRegister *RTRegister_Constructor(const char *name, size_t size, RTRegister_Data *value, RTRefCnt_Destructor destructor);

RTRegister *RTRegister_Lookup(const char *name);

int RTRegister_Write(RTRegister *regp, RTRegister_Data *value);

const char *RTRegister_Name(RTRegister *regp);
size_t RTRegister_Size(RTRegister *regp);

RTObserver *RTRegister_Observe(RTRegister *regp, RTReactiveTask *rtp);

int RTRegister_Unobserve(RTRegister *regp, RTObserver *obp);

int RTRegister_Read(RTRegister *regp, RTRegister_Data *value);

void RTRegister_Update_Release(RTRegister_Update *upp);
void RTRegister_Release(RTRegister *regp);

void RTRegister_Validate_Fails(void *arg);
void RTRegister_Update_Validate_Fails(void *arg);

INLINE_VALIDATE_REFCNT(RTRegister, RTRegister_Validate_Fails); /* no failure callback */
INLINE_VALIDATE_REFCNT(RTRegister_Update, RTRegister_Validate_Fails); /* no failure callback */
INLINE_VALIDATE(RTObserver, RTRegister_Validate_Fails); /* no failure callback */
#endif /*  RTREGISTER_H */

