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