/* Copyright (c) 2003-2004, Roger Dingledine
 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
 * Copyright (c) 2007-2018, The Tor Project, Inc. */
/* See LICENSE for licensing information */

#ifndef NAMEMAP_ST_H
#define NAMEMAP_ST_H

#include "lib/cc/compat_compiler.h"
#include "ext/ht.h"

struct smartlist_t;

/** Longest allowed name that's allowed in a namemap_t. */
#define MAX_NAMEMAP_NAME_LEN 128

/** An entry inside a namemap_t. Maps a string to a numeric identifier. */
typedef struct mapped_name_t {
  HT_ENTRY(mapped_name_t) node;
  unsigned intval;
  char name[FLEXIBLE_ARRAY_MEMBER];
} mapped_name_t;

/** A structure that allocates small numeric identifiers for names and maps
 * back and forth between them.  */
struct namemap_t {
  HT_HEAD(namemap_ht, mapped_name_t) ht;
  struct smartlist_t *names;
};

/** Macro to initialize a namemap. */
#define NAMEMAP_INIT() { HT_INITIALIZER(), NULL }

#endif
