
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#ifndef SkScriptCallBack_DEFINED
#define SkScriptCallBack_DEFINED

#include "SkOperand2.h"
#include "SkTDArray_Experimental.h"

class SkScriptCallBack {
public:
    enum Type {
        kBox,
        kFunction,
        kMember,
        kMemberFunction,
        kProperty,
        kUnbox
    };

    virtual bool getReference(const char* , size_t len, SkScriptValue2* result) {  return false; }
    virtual SkOperand2::OpType getReturnType(size_t ref, SkOperand2*) {
        return SkOperand2::kS32; }
    virtual Type getType() const = 0;
};

class SkScriptCallBackConvert : public SkScriptCallBack {
public:
    virtual bool convert(SkOperand2::OpType type, SkOperand2* operand) = 0;
};

class SkScriptCallBackFunction : public SkScriptCallBack {
public:
    virtual void getParamTypes(SkIntArray(SkOperand2::OpType)* types) = 0;
    virtual Type getType() const { return kFunction; }
    virtual bool invoke(size_t ref, SkOpArray* params, SkOperand2* value) = 0;
};

class SkScriptCallBackMember: public SkScriptCallBack {
public:
    bool getMemberReference(const char* , size_t len, void* object, SkScriptValue2* ref);
    virtual Type getType() const { return kMember; }
    virtual bool invoke(size_t ref, void* object, SkOperand2* value) = 0;
};

class SkScriptCallBackMemberFunction : public SkScriptCallBack {
public:
    bool getMemberReference(const char* , size_t len, void* object, SkScriptValue2* ref);
    virtual void getParamTypes(SkIntArray(SkOperand2::OpType)* types) = 0;
    virtual Type getType() const { return kMemberFunction; }
    virtual bool invoke(size_t ref, void* object, SkOpArray* params, SkOperand2* value) = 0;
};

class SkScriptCallBackProperty : public SkScriptCallBack {
public:
    virtual bool getConstValue(const char* name, size_t len, SkOperand2* value) { return false; }
    virtual bool getResult(size_t ref, SkOperand2* answer) { return false; }
    virtual Type getType() const { return kProperty; }
};

#endif // SkScriptCallBack_DEFINED
