// Copyright 2017 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef FXJS_CJX_DEFINE_H_
#define FXJS_CJX_DEFINE_H_

#include <vector>

#include "fxjs/cjs_return.h"
#include "fxjs/cjs_v8.h"

template <class C,
          CJS_Return (C::*M)(CJS_V8* runtime,
                             const std::vector<v8::Local<v8::Value>>& params)>
CJS_Return JSMethod(C* node,
                    CJS_V8* runtime,
                    const std::vector<v8::Local<v8::Value>>& params) {
  return (node->*M)(runtime, params);
}

#define JS_METHOD(method_name, class_name)                 \
  static CJS_Return method_name##_static(                  \
      CJX_Object* node, CJS_V8* runtime,                   \
      const std::vector<v8::Local<v8::Value>>& params) {   \
    return JSMethod<class_name, &class_name::method_name>( \
        static_cast<class_name*>(node), runtime, params);  \
  }                                                        \
  CJS_Return method_name(CJS_V8* runtime,                  \
                         const std::vector<v8::Local<v8::Value>>& params)

#define JS_PROP(prop_name) \
  void prop_name(CFXJSE_Value* pValue, bool bSetting, XFA_Attribute eAttribute)

#endif  // FXJS_CJX_DEFINE_H_