/*
 * libjingle
 * Copyright 2012, Google Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *  3. The name of the author may not be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

// 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 "talk/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 "talk/base/latebindingsymboltable.h.def"
//
// }

#ifndef TALK_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 ::talk_base::LateBindingSymbolTable {
 public:
  LATE_BINDING_SYMBOL_TABLE_CLASS_NAME();
  ~LATE_BINDING_SYMBOL_TABLE_CLASS_NAME();

#define X(sym) \
  typeof(&::sym) sym() const { \
    ASSERT(::talk_base::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 ::talk_base::LateBindingSymbolTable::TableInfo kTableInfo;
  static const char *const kSymbolNames[];

  void *table_[SYMBOL_TABLE_SIZE];

  DISALLOW_COPY_AND_ASSIGN(LATE_BINDING_SYMBOL_TABLE_CLASS_NAME);
};

#undef LATE_BINDING_SYMBOL_TABLE_CLASS_NAME
#undef LATE_BINDING_SYMBOL_TABLE_SYMBOLS_LIST
