112391Sjason@lowepower.com#pragma once
212391Sjason@lowepower.com#include "pybind11_tests.h"
312391Sjason@lowepower.com
412391Sjason@lowepower.com/// Simple class used to test py::local:
512391Sjason@lowepower.comtemplate <int> class LocalBase {
612391Sjason@lowepower.compublic:
712391Sjason@lowepower.com    LocalBase(int i) : i(i) { }
812391Sjason@lowepower.com    int i = -1;
912391Sjason@lowepower.com};
1012391Sjason@lowepower.com
1112391Sjason@lowepower.com/// Registered with py::module_local in both main and secondary modules:
1212391Sjason@lowepower.comusing LocalType = LocalBase<0>;
1312391Sjason@lowepower.com/// Registered without py::module_local in both modules:
1412391Sjason@lowepower.comusing NonLocalType = LocalBase<1>;
1512391Sjason@lowepower.com/// A second non-local type (for stl_bind tests):
1612391Sjason@lowepower.comusing NonLocal2 = LocalBase<2>;
1712391Sjason@lowepower.com/// Tests within-module, different-compilation-unit local definition conflict:
1812391Sjason@lowepower.comusing LocalExternal = LocalBase<3>;
1912391Sjason@lowepower.com/// Mixed: registered local first, then global
2012391Sjason@lowepower.comusing MixedLocalGlobal = LocalBase<4>;
2112391Sjason@lowepower.com/// Mixed: global first, then local
2212391Sjason@lowepower.comusing MixedGlobalLocal = LocalBase<5>;
2312391Sjason@lowepower.com
2412391Sjason@lowepower.com/// Registered with py::module_local only in the secondary module:
2512391Sjason@lowepower.comusing ExternalType1 = LocalBase<6>;
2612391Sjason@lowepower.comusing ExternalType2 = LocalBase<7>;
2712391Sjason@lowepower.com
2812391Sjason@lowepower.comusing LocalVec = std::vector<LocalType>;
2912391Sjason@lowepower.comusing LocalVec2 = std::vector<NonLocal2>;
3012391Sjason@lowepower.comusing LocalMap = std::unordered_map<std::string, LocalType>;
3112391Sjason@lowepower.comusing NonLocalVec = std::vector<NonLocalType>;
3212391Sjason@lowepower.comusing NonLocalVec2 = std::vector<NonLocal2>;
3312391Sjason@lowepower.comusing NonLocalMap = std::unordered_map<std::string, NonLocalType>;
3412391Sjason@lowepower.comusing NonLocalMap2 = std::unordered_map<std::string, uint8_t>;
3512391Sjason@lowepower.com
3612391Sjason@lowepower.comPYBIND11_MAKE_OPAQUE(LocalVec);
3712391Sjason@lowepower.comPYBIND11_MAKE_OPAQUE(LocalVec2);
3812391Sjason@lowepower.comPYBIND11_MAKE_OPAQUE(LocalMap);
3912391Sjason@lowepower.comPYBIND11_MAKE_OPAQUE(NonLocalVec);
4012391Sjason@lowepower.com//PYBIND11_MAKE_OPAQUE(NonLocalVec2); // same type as LocalVec2
4112391Sjason@lowepower.comPYBIND11_MAKE_OPAQUE(NonLocalMap);
4212391Sjason@lowepower.comPYBIND11_MAKE_OPAQUE(NonLocalMap2);
4312391Sjason@lowepower.com
4412391Sjason@lowepower.com
4512391Sjason@lowepower.com// Simple bindings (used with the above):
4612391Sjason@lowepower.comtemplate <typename T, int Adjust = 0, typename... Args>
4712391Sjason@lowepower.compy::class_<T> bind_local(Args && ...args) {
4812391Sjason@lowepower.com    return py::class_<T>(std::forward<Args>(args)...)
4912391Sjason@lowepower.com        .def(py::init<int>())
5012391Sjason@lowepower.com        .def("get", [](T &i) { return i.i + Adjust; });
5112391Sjason@lowepower.com};
5212391Sjason@lowepower.com
5312391Sjason@lowepower.com// Simulate a foreign library base class (to match the example in the docs):
5412391Sjason@lowepower.comnamespace pets {
5512391Sjason@lowepower.comclass Pet {
5612391Sjason@lowepower.compublic:
5712391Sjason@lowepower.com    Pet(std::string name) : name_(name) {}
5812391Sjason@lowepower.com    std::string name_;
5912391Sjason@lowepower.com    const std::string &name() { return name_; }
6012391Sjason@lowepower.com};
6112391Sjason@lowepower.com}
6212391Sjason@lowepower.com
6312391Sjason@lowepower.comstruct MixGL { int i; MixGL(int i) : i{i} {} };
6412391Sjason@lowepower.comstruct MixGL2 { int i; MixGL2(int i) : i{i} {} };
65