/*
    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 EMode test_function(EMode mode) {
        std::cout << "Example4::test_function(enum=" << mode << ")" << std::endl;
        return mode;
    }
};

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 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);
}
