test_enum.cpp revision 11986
111986Sandreas.sandberg@arm.com/*
211986Sandreas.sandberg@arm.com    tests/test_enums.cpp -- enumerations
311986Sandreas.sandberg@arm.com
411986Sandreas.sandberg@arm.com    Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
511986Sandreas.sandberg@arm.com
611986Sandreas.sandberg@arm.com    All rights reserved. Use of this source code is governed by a
711986Sandreas.sandberg@arm.com    BSD-style license that can be found in the LICENSE file.
811986Sandreas.sandberg@arm.com*/
911986Sandreas.sandberg@arm.com
1011986Sandreas.sandberg@arm.com#include "pybind11_tests.h"
1111986Sandreas.sandberg@arm.com
1211986Sandreas.sandberg@arm.comenum UnscopedEnum {
1311986Sandreas.sandberg@arm.com    EOne = 1,
1411986Sandreas.sandberg@arm.com    ETwo
1511986Sandreas.sandberg@arm.com};
1611986Sandreas.sandberg@arm.com
1711986Sandreas.sandberg@arm.comenum class ScopedEnum {
1811986Sandreas.sandberg@arm.com    Two = 2,
1911986Sandreas.sandberg@arm.com    Three
2011986Sandreas.sandberg@arm.com};
2111986Sandreas.sandberg@arm.com
2211986Sandreas.sandberg@arm.comenum Flags {
2311986Sandreas.sandberg@arm.com    Read = 4,
2411986Sandreas.sandberg@arm.com    Write = 2,
2511986Sandreas.sandberg@arm.com    Execute = 1
2611986Sandreas.sandberg@arm.com};
2711986Sandreas.sandberg@arm.com
2811986Sandreas.sandberg@arm.comclass ClassWithUnscopedEnum {
2911986Sandreas.sandberg@arm.compublic:
3011986Sandreas.sandberg@arm.com    enum EMode {
3111986Sandreas.sandberg@arm.com        EFirstMode = 1,
3211986Sandreas.sandberg@arm.com        ESecondMode
3311986Sandreas.sandberg@arm.com    };
3411986Sandreas.sandberg@arm.com
3511986Sandreas.sandberg@arm.com    static EMode test_function(EMode mode) {
3611986Sandreas.sandberg@arm.com        return mode;
3711986Sandreas.sandberg@arm.com    }
3811986Sandreas.sandberg@arm.com};
3911986Sandreas.sandberg@arm.com
4011986Sandreas.sandberg@arm.comstd::string test_scoped_enum(ScopedEnum z) {
4111986Sandreas.sandberg@arm.com    return "ScopedEnum::" + std::string(z == ScopedEnum::Two ? "Two" : "Three");
4211986Sandreas.sandberg@arm.com}
4311986Sandreas.sandberg@arm.com
4411986Sandreas.sandberg@arm.comtest_initializer enums([](py::module &m) {
4511986Sandreas.sandberg@arm.com    m.def("test_scoped_enum", &test_scoped_enum);
4611986Sandreas.sandberg@arm.com
4711986Sandreas.sandberg@arm.com    py::enum_<UnscopedEnum>(m, "UnscopedEnum", py::arithmetic())
4811986Sandreas.sandberg@arm.com        .value("EOne", EOne)
4911986Sandreas.sandberg@arm.com        .value("ETwo", ETwo)
5011986Sandreas.sandberg@arm.com        .export_values();
5111986Sandreas.sandberg@arm.com
5211986Sandreas.sandberg@arm.com    py::enum_<ScopedEnum>(m, "ScopedEnum", py::arithmetic())
5311986Sandreas.sandberg@arm.com        .value("Two", ScopedEnum::Two)
5411986Sandreas.sandberg@arm.com        .value("Three", ScopedEnum::Three);
5511986Sandreas.sandberg@arm.com
5611986Sandreas.sandberg@arm.com    py::enum_<Flags>(m, "Flags", py::arithmetic())
5711986Sandreas.sandberg@arm.com        .value("Read", Flags::Read)
5811986Sandreas.sandberg@arm.com        .value("Write", Flags::Write)
5911986Sandreas.sandberg@arm.com        .value("Execute", Flags::Execute)
6011986Sandreas.sandberg@arm.com        .export_values();
6111986Sandreas.sandberg@arm.com
6211986Sandreas.sandberg@arm.com    py::class_<ClassWithUnscopedEnum> exenum_class(m, "ClassWithUnscopedEnum");
6311986Sandreas.sandberg@arm.com    exenum_class.def_static("test_function", &ClassWithUnscopedEnum::test_function);
6411986Sandreas.sandberg@arm.com    py::enum_<ClassWithUnscopedEnum::EMode>(exenum_class, "EMode")
6511986Sandreas.sandberg@arm.com        .value("EFirstMode", ClassWithUnscopedEnum::EFirstMode)
6611986Sandreas.sandberg@arm.com        .value("ESecondMode", ClassWithUnscopedEnum::ESecondMode)
6711986Sandreas.sandberg@arm.com        .export_values();
6811986Sandreas.sandberg@arm.com});
69