#ifndef ANDROID_RENDERSCRIPT_CLOSURE_H_
#define ANDROID_RENDERSCRIPT_CLOSURE_H_

#include "rsDefines.h"
#include "rsMap.h"
#include "rsObjectBase.h"

namespace android {
namespace renderscript {

class Allocation;
class Context;
class IDBase;
class ObjectBase;
class ScriptFieldID;
class ScriptInvokeID;
class ScriptKernelID;
class Type;

class Closure : public ObjectBase {
 public:
    Closure(Context* context,
            const ScriptKernelID* kernelID,
            Allocation* returnValue,
            const int numValues,
            const ScriptFieldID** fieldIDs,
            const void** values,  // Allocations or primitive (numeric) types
            const size_t* sizes,  // size for data type. -1 indicates an allocation.
            const Closure** depClosures,
            const ScriptFieldID** depFieldIDs);
    Closure(Context* context,
            const ScriptInvokeID* invokeID,
            const void* params,
            const size_t paramLength,
            const size_t numValues,
            const ScriptFieldID** fieldIDs,
            const void** values,  // Allocations or primitive (numeric) types
            const size_t* sizes);  // size for data type. -1 indicates an allocation.

    virtual ~Closure();

    virtual void serialize(Context *rsc, OStream *stream) const {}

    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_CLOSURE; }

    void setArg(const uint32_t index, const void* value, const size_t size);
    void setGlobal(const ScriptFieldID* fieldID, const void* value,
                   const size_t size);

    Context* mContext;

    // KernelId or InvokeID
    const ObjectBaseRef<IDBase> mFunctionID;
    // Flag indicating if this closure is for a kernel (true) or invocable
    // function (false)
    const bool mIsKernel;

    // Values referrenced in arguments and globals cannot be futures. They must be
    // either a known value or unbound value.
    // For now, all arguments should be Allocations.
    const void** mArgs;
    size_t mNumArg;

    // A global could be allocation or any primitive data type.
    Map<const ScriptFieldID*, Pair<const void*, size_t>> mGlobals;

    Allocation* mReturnValue;

    // All the other closures which this closure depends on for one of its
    // arguments, and the fields which it depends on.
    Map<const Closure*, Map<int, const ObjectBaseRef<ScriptFieldID>*>*> mArgDeps;

    // All the other closures that this closure depends on for one of its fields,
    // and the fields that it depends on.
    Map<const Closure*, Map<const ObjectBaseRef<ScriptFieldID>*,
            const ObjectBaseRef<ScriptFieldID>*>*> mGlobalDeps;

    const void* mParams;
    const size_t mParamLength;
};

}  // namespace renderscript
}  // namespace android

#endif  // ANDROID_RENDERSCRIPT_CLOSURE_H_
