Calling Codon from C/C++
========================

Calling C/C++ from Codon is quite easy with ``from C import``, but Codon can also be called from C/C++ code. To make a Codon function externally visible, simply annotate it with ``@export``:

.. code-block:: python

    @export
    def foo(n: int):
        for i in range(n):
            print(i * i)
        return n * n

Note that only top-level, non-generic functions can be exported. Now we can create a shared library containing ``foo`` (assuming source file *foo.codon*):

.. code-block:: bash

    codon build -o foo.o foo.codon
    gcc -shared -lcodonrt -lomp foo.o -o libfoo.so

(The last command might require an additional ``-L/path/to/codonrt/lib/`` argument if ``libcodonrt`` is not installed on a standard path.)

Now we can call ``foo`` from a C program:

.. code-block:: C

    #include <stdint.h>
    #include <stdio.h>

    int64_t foo(int64_t);

    int main() {
      printf("%llu\n", foo(10));
    }

Compile:

.. code-block:: bash

    gcc -o foo -L. -lfoo foo.c

Now running ``./foo`` should invoke ``foo()`` as defined in Codon, with an argument of ``10``.

Converting types
----------------

The following table shows the conversions between Codon and C/C++ types:

============  ============
**Codon**      **C/C++**
------------  ------------
``int``       ``long`` or ``int64_t``
``float``     ``double``
``bool``      ``bool``
``byte``      ``char`` or ``int8_t``
``str``       ``{int64_t, char*}`` (length and data)
``class``     Pointer to corresponding tuple
``@tuple``    Struct of fields
============  ============