/*
    example/example4.cpp -- global constants and functions, enumerations, raw byte strings

    Copyright (c) 2015 Wenzel Jakob <wenzel@inf.ethz.ch>

    All rights reserved. Use of this source code is governed by a
    BSD-style license that can be found in the LICENSE file.
*/

#include "example.h"

enum EMyEnumeration {
    EFirstEntry = 1,
    ESecondEntry
};

class Example4 {
public:
    enum EMode {
        EFirstMode = 1,
        ESecondMode
    };

    static void test_function(EMode mode) {
        std::cout << "Example4::test_function(enum=" << mode << ")" << std::endl;
    }
};

bool test_function1() {
    std::cout << "test_function()" << std::endl;
    return false;
}

void test_function2(EMyEnumeration k) {
    std::cout << "test_function(enum=" << k << ")" << std::endl;
}

float test_function3(int i) {
    std::cout << "test_function(" << i << ")" << std::endl;
    return i / 2.f;
}

py::bytes return_bytes() {
    const char *data = "\x01\x00\x02\x00";
    return py::bytes(std::string(data, 4));
}

void print_bytes(py::bytes bytes) {
    std::string value = (std::string) bytes;
    for (size_t i = 0; i < value.length(); ++i)
        std::cout << "bytes[" << i << "]=" << (int) value[i] << std::endl;
}

void init_ex4(py::module &m) {
    m.def("test_function", &test_function1);
    m.def("test_function", &test_function2);
    m.def("test_function", &test_function3);
    m.attr("some_constant") = py::int_(14);

    py::enum_<EMyEnumeration>(m, "EMyEnumeration")
        .value("EFirstEntry", EFirstEntry)
        .value("ESecondEntry", ESecondEntry)
        .export_values();

    py::class_<Example4> ex4_class(m, "Example4");
    ex4_class.def_static("test_function", &Example4::test_function);
    py::enum_<Example4::EMode>(ex4_class, "EMode")
        .value("EFirstMode", Example4::EFirstMode)
        .value("ESecondMode", Example4::ESecondMode)
        .export_values();

    m.def("return_bytes", &return_bytes);
    m.def("print_bytes", &print_bytes);
}
