/* Macros for general registry objects.

   Copyright (C) 2011-2021 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef REGISTRY_H
#define REGISTRY_H

#include <type_traits>

/* The macros here implement a template type and functions for
   associating some user data with a container object.

   A registry is associated with a struct tag name.  To attach a
   registry to a structure, use DEFINE_REGISTRY.  This takes the
   structure tag and an access method as arguments.  In the usual
   case, where the registry fields appear directly in the struct, you
   can use the 'REGISTRY_FIELDS' macro to declare the fields in the
   struct definition, and you can pass 'REGISTRY_ACCESS_FIELD' as the
   access argument to DEFINE_REGISTRY.  In other cases, use
   REGISTRY_FIELDS to define the fields in the appropriate spot, and
   then define your own accessor to find the registry field structure
   given an instance of your type.

   The API user requests a key from a registry during gdb
   initialization.  Later this key can be used to associate some
   module-specific data with a specific container object.

   The exported API is best used via the wrapper macros:
   
   - register_TAG_data(TAG)
   Get a new key for the container type TAG.
   
   - register_TAG_data_with_cleanup(TAG, SAVE, FREE)
   Get a new key for the container type TAG.
   SAVE and FREE are defined as void (*) (struct TAG *object, void *data)
   When the container object OBJECT is destroyed, first all registered SAVE
   functions are called.
   Then all FREE functions are called.
   Either or both may be NULL.  DATA is the data associated with the
   container object OBJECT.
   
   - clear_TAG_data(TAG, OBJECT)
   Clear all the data associated with OBJECT.  Should be called by the
   container implementation when a container object is destroyed.
   
   - set_TAG_data(TAG, OBJECT, KEY, DATA)
   Set the data on an object.
   
   - TAG_data(TAG, OBJECT, KEY)
   Fetch the data for an object; returns NULL if it has not been set.
*/

/* This structure is used in a container to hold the data that the
   registry uses.  */

struct registry_fields
{
  void **data;
  unsigned num_data;
};

/* This macro is used in a container struct definition to define the
   fields used by the registry code.  */

#define REGISTRY_FIELDS				\
  struct registry_fields registry_data

/* A convenience macro for the typical case where the registry data is
   kept as fields of the object.  This can be passed as the ACCESS
   method to DEFINE_REGISTRY.  */

#define REGISTRY_ACCESS_FIELD(CONTAINER) \
  (CONTAINER)

/* Opaque type representing a container type with a registry.  This
   type is never defined.  This is used to factor out common
   functionality of all struct tag names into common code.  IOW,
   "struct tag name" pointers are cast to and from "struct
   registry_container" pointers when calling the common registry
   "backend" functions.  */
struct registry_container;

/* Registry callbacks have this type.  */
typedef void (*registry_data_callback) (struct registry_container *, void *);

struct registry_data
{
  unsigned index;
  registry_data_callback save;
  registry_data_callback free;
};

struct registry_data_registration
{
  struct registry_data *data;
  struct registry_data_registration *next;
};

struct registry_data_registry
{
  struct registry_data_registration *registrations;
  unsigned num_registrations;
};

/* Registry backend functions.  Client code uses the frontend
   functions defined by DEFINE_REGISTRY below instead.  */

const struct registry_data *register_data_with_cleanup
  (struct registry_data_registry *registry,
   registry_data_callback save,
   registry_data_callback free);

void registry_alloc_data (struct registry_data_registry *registry,
			  struct registry_fields *registry_fields);

/* Cast FUNC and CONTAINER to the real types, and call FUNC, also
   passing DATA.  */
typedef void (*registry_callback_adaptor) (registry_data_callback func,
					   struct registry_container *container,
					   void *data);

void registry_clear_data (struct registry_data_registry *data_registry,
			  registry_callback_adaptor adaptor,
			  struct registry_container *container,
			  struct registry_fields *fields);

void registry_container_free_data (struct registry_data_registry *data_registry,
				   registry_callback_adaptor adaptor,
				   struct registry_container *container,
				   struct registry_fields *fields);

void registry_set_data (struct registry_fields *fields,
			const struct registry_data *data,
			void *value);

void *registry_data (struct registry_fields *fields,
		     const struct registry_data *data);

/* Define a new registry implementation.  */

#define DEFINE_REGISTRY(TAG, ACCESS)					\
static struct registry_data_registry TAG ## _data_registry = { NULL, 0 }; \
									\
const struct TAG ## _data *						\
register_ ## TAG ## _data_with_cleanup (void (*save) (struct TAG *, void *), \
					void (*free) (struct TAG *, void *)) \
{									\
  return (struct TAG ## _data *)					\
    register_data_with_cleanup (&TAG ## _data_registry,			\
				(registry_data_callback) save,		\
				(registry_data_callback) free);		\
}									\
									\
const struct TAG ## _data *						\
register_ ## TAG ## _data (void)					\
{									\
  return register_ ## TAG ## _data_with_cleanup (NULL, NULL);		\
}									\
									\
static void								\
TAG ## _alloc_data (struct TAG *container)				\
{									\
  struct registry_fields *rdata = &ACCESS (container)->registry_data;	\
									\
  registry_alloc_data (&TAG ## _data_registry, rdata);			\
}									\
									\
static void								\
TAG ## registry_callback_adaptor (registry_data_callback func,		\
				  struct registry_container *container, \
				  void *data)				\
{									\
  struct TAG *tagged_container = (struct TAG *) container;		\
									\
  registry_ ## TAG ## _callback tagged_func				\
    = (registry_ ## TAG ## _callback) func;				\
									\
  tagged_func (tagged_container, data);					\
}									\
									\
void									\
clear_ ## TAG ## _data (struct TAG *container)				\
{									\
  struct registry_fields *rdata = &ACCESS (container)->registry_data;	\
									\
  registry_clear_data (&TAG ## _data_registry,				\
		       TAG ## registry_callback_adaptor,		\
		       (struct registry_container *) container,		\
		       rdata);						\
}									\
									\
static void								\
TAG ## _free_data (struct TAG *container)				\
{									\
  struct registry_fields *rdata = &ACCESS (container)->registry_data;	\
									\
  registry_container_free_data (&TAG ## _data_registry,			\
				TAG ## registry_callback_adaptor,	\
				(struct registry_container *) container, \
				rdata);					\
}									\
									\
void									\
set_ ## TAG ## _data (struct TAG *container,				\
		      const struct TAG ## _data *data,			\
		      void *value)					\
{									\
  struct registry_fields *rdata = &ACCESS (container)->registry_data;	\
									\
  registry_set_data (rdata,						\
		     (struct registry_data *) data,			\
		     value);						\
}									\
									\
void *									\
TAG ## _data (struct TAG *container, const struct TAG ## _data *data)	\
{									\
  struct registry_fields *rdata = &ACCESS (container)->registry_data;	\
									\
  return registry_data (rdata,						\
			(struct registry_data *) data);			\
}


/* External declarations for the registry functions.  */

#define DECLARE_REGISTRY(TAG)						\
struct TAG ## _data;							\
typedef void (*registry_ ## TAG ## _callback) (struct TAG *, void *);	\
extern const struct TAG ## _data *register_ ## TAG ## _data (void);	\
extern const struct TAG ## _data *register_ ## TAG ## _data_with_cleanup \
 (registry_ ## TAG ## _callback save, registry_ ## TAG ## _callback free); \
extern void clear_ ## TAG ## _data (struct TAG *);			\
extern void set_ ## TAG ## _data (struct TAG *,				\
				  const struct TAG ## _data *data,	\
				  void *value);				\
extern void *TAG ## _data (struct TAG *,				\
			   const struct TAG ## _data *data);		\
									\
template<typename DATA, typename Deleter = std::default_delete<DATA>>	\
class TAG ## _key							\
{									\
public:									\
									\
  TAG ## _key ()							\
    : m_key (register_ ## TAG ## _data_with_cleanup (nullptr,		\
						     cleanup))		\
  {									\
  }									\
									\
  DATA *get (struct TAG *obj) const					\
  {									\
    return (DATA *) TAG ## _data (obj, m_key);				\
  }									\
									\
  void set (struct TAG *obj, DATA *data) const				\
  {									\
    set_ ## TAG ## _data (obj, m_key, data);				\
  }									\
									\
  template<typename Dummy = DATA *, typename... Args>			\
  typename std::enable_if<std::is_same<Deleter,				\
				       std::default_delete<DATA>>::value, \
			  Dummy>::type					\
  emplace (struct TAG *obj, Args &&...args) const			\
  {									\
    DATA *result = new DATA (std::forward<Args> (args)...);		\
    set (obj, result);							\
    return result;							\
  }									\
									\
  void clear (struct TAG *obj) const					\
  {									\
    DATA *datum = get (obj);						\
    if (datum != nullptr)						\
      {									\
	cleanup (obj, datum);						\
	set (obj, nullptr);						\
      }									\
  }									\
									\
private:								\
									\
  static void cleanup (struct TAG *obj, void *arg)			\
  {									\
    DATA *datum = (DATA *) arg;						\
    Deleter d;								\
    d (datum);								\
  }									\
									\
  const struct TAG ## _data *m_key;					\
};

#endif /* REGISTRY_H */
