# Type behaviours

## Math operators

- asBEHAVE_ADD
- asBEHAVE_SUBTRACT
- asBEHAVE_MULTIPLY
- asBEHAVE_DIVIDE
- asBEHAVE_MODULO
- asBEHAVE_NEGATE

All of these, with exception to asBEHAVE_NEGATE, should be registered with two parameters using asIScriptEngine::RegisterGlobalBehaviour. asBEHAVE_NEGATE should be registered with no parameters using asIScriptEngine::RegisterObjectBehaviour.

    // Example ADD behaviour for a value type
    value operator+(const value &a, const value &b)
    {
        // Perform the add operation and return the new value
        value result;
        result.attr = a.attr + b.attr;
        return result;
    }

    // Example registration of the behaviour
    r = engine->RegisterGlobalBehaviour(asBEHAVE_ADD, "value f(const value &in, const value &in)", asFUNCTIONPR(operator+, (const value&,const value&), value), asCALL_CDECL); assert( r >= 0 );

## Comparison operators

- asBEHAVE_EQUAL
- asBEHAVE_NOTEQUAL
- asBEHAVE_LESSTHAN,
- asBEHAVE_GREATERTHAN,
- asBEHAVE_LEQUAL,
- asBEHAVE_GEQUAL

These should be registered with two parameters using asIScriptEngine::RegisterGlobalBehaviour. All of them should return a bool type.

## Bitwise operators

- asBEHAVE_BIT_OR
- asBEHAVE_BIT_AND
- asBEHAVE_BIT_XOR
- asBEHAVE_BIT_SLL
- asBEHAVE_BIT_SRL
- asBEHAVE_BIT_SRA

These should be registered with two parameters using asIScriptEngine::RegisterGlobalBehaviour.

## Assignment operators

- asBEHAVE_ASSIGNMENT
- asBEHAVE_ADD_ASSIGN
- asBEHAVE_SUB_ASSIGN
- asBEHAVE_MUL_ASSIGN
- asBEHAVE_DIV_ASSIGN
- asBEHAVE_MOD_ASSIGN
- asBEHAVE_OR_ASSIGN
- asBEHAVE_AND_ASSIGN
- asBEHAVE_XOR_ASSIGN
- asBEHAVE_SLL_ASSIGN
- asBEHAVE_SRL_ASSIGN
- asBEHAVE_SRA_ASSIGN

All of these should be registered with one parameter using asIScriptEngine::RegisterObjectBehaviour. Preferably the functions should return a reference to the object itself.

    // Example ASSIGNMENT behaviour for a reference type
    object &object::operator=(const object &other)
    {
        // Copy only the buffer, not the reference counter
        attr = other.attr;

        // Return a reference to this object
        return *this;
    }

    // Example registration of the behaviour
    r = engine->RegisterObjectBehaviour("object", asBEHAVE_ASSIGNMENT, "object &f(const object &in)", asMETHODPR(object, operator =, (const object&), object&), asCALL_THISCALL); assert( r >= 0 );

## Index operator

- asBEHAVE_INDEX

This behaviour should be registered with one parameter using asIScriptEngine::RegisterObjectBehaviour.

## Cast operators

- asBEHAVE_VALUE_CAST
- asBEHAVE_IMPLICIT_VALUE_CAST
- asBEHAVE_REF_CAST
- asBEHAVE_IMPLICIT_REF_CAST

asBEHAVE_VALUE_CAST and asBEHAVE_IMPLICIT_VALUE_CAST must be registered without parameters using asIScriptEngine::RegisterObjectBehaviour. The return type can be any type, except bool and void. The value cast allows explicit casts through construct calls, whereas the implicit value cast also allow the compiler to implicitly use the behaviour to convert expressions as necessary.

asBEHAVE_REF_CAST and asBEHAVE_IMPLICIT_REF_CAST must be registered with one parameter using asIScriptEngine::RegisterGlobalBehaviour. The parameter must be an object handle, as must the return type. The only difference between the two is that the script compiler may use the later for implicit casts, while the former can only be used by explicitly calling the cast operator. This distinction is very useful when registering class hierarchies, where cast to a base class usually is registered with an implicit cast, whereas a cast to a derived class usually is registered with an explicit cast.

    // Example REF_CAST behaviour
    B* castAtoB(A* a)
    {
        // If the handle already is a null handle, then just return the null handle
        if( !a ) return 0;

        // Now try to dynamically cast the pointer to the wanted type
        B* b = dynamic_cast<B*>(a);
        if( b == 0 )
        {
            // Since the cast couldn't be made, we need to release the handle we received
            a->release();
        }
        return b;
    }

    // Example registration of the behaviour
    r = engine->RegisterGlobalBehaviour(asBEHAVE_REF_CAST, "B@ f(A@)", asFUNCTION(castAToB), asCALL_CDECL); assert( r >= 0 );

See also:
  asBEHAVE_CONSTRUCT and asBEHAVE_FACTORY in Memory management as well for an alternative value cast operator.

## Memory management

- asBEHAVE_CONSTRUCT
- asBEHAVE_DESTRUCT
- asBEHAVE_FACTORY
- asBEHAVE_ADDREF
- asBEHAVE_RELEASE

These must be registered using asIScriptEngine::RegisterObjectBehaviour. asBEHAVE_CONSTRUCT and asBEHAVE_FACTORY may take parameters for object initialization, but the others shouldn't use parameters.

See also:
  Registering an object type for more information on how to register types.

## Garbage collection

- asBEHAVE_GETREFCOUNT
- asBEHAVE_SETGCFLAG
- asBEHAVE_GETGCFLAG
- asBEHAVE_ENUMREFS
- asBEHAVE_RELEASEREFS

These behaviours are exclusive for objects that have been registered with the flag asOBJ_GC. All of them should be registered using asIScriptEngine::RegisterObjectBehaviour.

See also:
  Implementing a garbage collected object for more information on using these.