AngelScript: Registering operator behaviours

# Registering operator behaviours

In order for AngelScript to know how to work with the application registered types, it is necessary to register some behaviours, for example for memory management.

The memory management behaviours are described with the registeration of registering reference types and value types.

Other advanced behaviours are described with the advanced types.

Only a few operators have special behaviours for them, the other operators are registered as ordinary class methods with predefined names.

## Index operator

The index operator is usually used to access an element by index, e.g. the elements of an array.

    // Simple implementation of the index operator
    int &MyClass::operator[] (int index)
    {
      return internal_array[index];
    }

    // Non-mutable variant that works on const references to the object
    const int &MyClass::operator[] (int index) const
    {
      return internal_array[index];
    }

    // Register both the const and non-const alternative for const correctness
    r = engine->RegisterObjectBehaviour("mytype", asBEHAVE_INDEX, "int &f(int)", asMETHODPR(MyClass, operator[], (int), int&), asCALL_THISCALL); assert( r >= 0 );
    r = engine->RegisterObjectBehaviour("mytype", asBEHAVE_INDEX, "const int &f(int) const", asMETHODPR(MyClass, operator[], (int) const, const int&), asCALL_THISCALL); assert( r >= 0 );

## Value cast operators

The value cast operators are used to allow the scripts to convert an object type to another type by constructing a new value. This is different from a reference cast, that do not construct new values, but rather changes the way it is perceived.

By registering the behaviour either as asBEHAVE_VALUE_CAST or asBEHAVE_IMPLICIT_VALUE_CAST you let AngelScript know whether the behaviour may be used to implicitly cast the type or not.

    // Convert a string to an int
    int ConvStringToInt(const std::string &s)
    {
      return atoi(s.c_str());
    }

    // Register the behaviour
    r = engine->RegisterObjectBehaviour("string", asBEHAVE_VALUE_CAST, "int f() const", asFUNCTION(ConvStringToInt), asCALL_CDECL_OBJLAST); assert( r >= 0 );

The return type for the cast behaviour can be any type except bool and void. The value cast is meant to create a new value, so if the function returns a reference or an object handle make sure it points to a new value and not the original one.

The object constructors and factories also serve as alternative explicit value cast operators, so if a constructor or factory is already available then there is no need to register the explicit value cast operator.