/*
 *  Copyright 2012 The WebRTC Project Authors. All rights reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

// This file is a supermacro
// (see http://wanderinghorse.net/computing/papers/supermacros_cpp.html) to
// expand a declaration of a late-binding symbol table class.
//
// Arguments:
// LATE_BINDING_SYMBOL_TABLE_CLASS_NAME: Name of the class to generate.
// LATE_BINDING_SYMBOL_TABLE_SYMBOLS_LIST: List of symbols to load from the DLL,
//     as an X-Macro list (see http://www.drdobbs.com/blogs/cpp/228700289).
//
// From a .h file, include the header(s) for the DLL to late-bind and the
// latebindingsymboltable.h header, and then call this supermacro (optionally
// from inside the namespace for the class to generate, if any). Example:
//
// #include <headerfordll.h>
//
// #include "webrtc/base/latebindingsymboltable.h"
//
// namespace foo {
//
// #define MY_CLASS_NAME DesiredClassName
// #define MY_SYMBOLS_LIST X(acos) X(sin) X(tan)
//
// #define LATE_BINDING_SYMBOL_TABLE_CLASS_NAME MY_CLASS_NAME
// #define LATE_BINDING_SYMBOL_TABLE_SYMBOLS_LIST MY_SYMBOLS_LIST
// #include "webrtc/base/latebindingsymboltable.h.def"
//
// }

#ifndef WEBRTC_BASE_LATEBINDINGSYMBOLTABLE_H_
#error You must first include latebindingsymboltable.h
#endif

#ifndef LATE_BINDING_SYMBOL_TABLE_CLASS_NAME
#error You must define LATE_BINDING_SYMBOL_TABLE_CLASS_NAME
#endif

#ifndef LATE_BINDING_SYMBOL_TABLE_SYMBOLS_LIST
#error You must define LATE_BINDING_SYMBOL_TABLE_SYMBOLS_LIST
#endif

class LATE_BINDING_SYMBOL_TABLE_CLASS_NAME :
    public ::rtc::LateBindingSymbolTable {
 public:
  LATE_BINDING_SYMBOL_TABLE_CLASS_NAME();
  ~LATE_BINDING_SYMBOL_TABLE_CLASS_NAME();

#define X(sym) \
  typeof(&::sym) sym() const { \
    ASSERT(::rtc::LateBindingSymbolTable::IsLoaded()); \
    return reinterpret_cast<typeof(&::sym)>(table_[SYMBOL_TABLE_INDEX_##sym]); \
  }
LATE_BINDING_SYMBOL_TABLE_SYMBOLS_LIST
#undef X

 private:
  enum {
#define X(sym) \
    SYMBOL_TABLE_INDEX_##sym,
LATE_BINDING_SYMBOL_TABLE_SYMBOLS_LIST
#undef X
    SYMBOL_TABLE_SIZE
  };

  static const ::rtc::LateBindingSymbolTable::TableInfo kTableInfo;
  static const char *const kSymbolNames[];

  void *table_[SYMBOL_TABLE_SIZE];

  RTC_DISALLOW_COPY_AND_ASSIGN(LATE_BINDING_SYMBOL_TABLE_CLASS_NAME);
};

#undef LATE_BINDING_SYMBOL_TABLE_CLASS_NAME
#undef LATE_BINDING_SYMBOL_TABLE_SYMBOLS_LIST
