self.objc_name = m[1:]
self.base = ''
self.is_base_class = True
+ self.native_ptr_name = "nativePtr"
if decl[1]:
self.base = re.sub(r"^.*:", "", decl[1].split(",")[0]).strip().replace(self.objc_name, "")
+ if self.base:
+ self.is_base_class = False
+ self.native_ptr_name = "nativePtr" + self.objc_name
def __repr__(self):
return Template("CLASS $namespace::$classpath.$name : $base").substitute(**self.__dict__)
if self.base:
self.objc_header_template = T_OBJC_CLASS_HEADER
self.objc_body_template = T_OBJC_CLASS_BODY
- self.is_base_class = False
else:
self.base = "NSObject"
if self.name != Module:
nativePointerHandling = Template(
"""
#ifdef __cplusplus
-@property(readonly)$cName* nativePtr;
+@property(readonly)cv::Ptr<$cName> $native_ptr_name;
#endif
-- (void)dealloc;
-
#ifdef __cplusplus
-- (instancetype)initWithNativePtr:($cName*)nativePtr;
-+ (instancetype)fromNative:($cName*)nativePtr;
+- (instancetype)initWithNativePtr:(cv::Ptr<$cName>)nativePtr;
++ (instancetype)fromNative:(cv::Ptr<$cName>)nativePtr;
#endif
"""
).substitute(
- cName = self.fullName(isCPP=True)
- ) if self.is_base_class else "",
+ cName = self.fullName(isCPP=True),
+ native_ptr_name = self.native_ptr_name
+ ),
manualMethodDeclations = "",
methodDeclarations = self.method_declarations.getvalue(),
name = self.name,
module = M,
nativePointerHandling=Template(
"""
-- (void)dealloc {
- if (_nativePtr != NULL) {
- delete _nativePtr;
- }
-}
-
-- (instancetype)initWithNativePtr:($cName*)nativePtr {
- self = [super init];
+- (instancetype)initWithNativePtr:(cv::Ptr<$cName>)nativePtr {
+ self = [super $init_call];
if (self) {
- _nativePtr = nativePtr;
+ _$native_ptr_name = nativePtr;
}
return self;
}
-+ (instancetype)fromNative:($cName*)nativePtr {
++ (instancetype)fromNative:(cv::Ptr<$cName>)nativePtr {
return [[$objcName alloc] initWithNativePtr:nativePtr];
}
"""
).substitute(
- cName=self.fullName(isCPP=True),
- objcName=self.objc_name
- ) if self.is_base_class else "",
+ cName = self.fullName(isCPP=True),
+ objcName = self.objc_name,
+ native_ptr_name = self.native_ptr_name,
+ init_call = "init" if self.is_base_class else "initWithNativePtr:nativePtr"
+ ),
manualMethodDeclations = "",
methodImplementations = self.method_implementations.getvalue(),
name = self.name,
type_dict.setdefault(name, {}).update(
{ "objc_type" : classinfo.objc_name + "*",
"from_cpp" : "[" + classinfo.objc_name + " fromNative:%(n)s]",
- "to_cpp" : "*(" + classinfo.namespace.replace(".", "::") + "::" + classinfo.objc_name + "*)(%(n)s.nativePtr)" }
+ "to_cpp" : "*(%(n)s." + classinfo.native_ptr_name + ")" }
)
# missing_consts { Module : { public : [[name, val],...], private : [[]...] } }
type_dict.setdefault("Ptr_"+name, {}).update(
{ "objc_type" : classinfo.objc_name + "*",
"c_type" : name,
- "to_cpp": "%(n)s.nativePtr",
+ "to_cpp": "%(n)s." + classinfo.native_ptr_name,
"from_cpp_ptr": "[" + name + " fromNativePtr:%(n)s]"}
)
logging.info('ok: class %s, name: %s, base: %s', classinfo, name, classinfo.base)
elif ret_type.startswith("Ptr_"):
cpp_type = type_dict[ret_type]["c_type"]
namespace_prefix = self.get_namespace_prefix(cpp_type)
- ret_val = namespace_prefix + cpp_type + "* retVal = "
+ ret_val = "cv::Ptr<" + namespace_prefix + cpp_type + "> retVal = "
ret = "return [" + type_dict[ret_type]["objc_type"][:-1] + " fromNative:retVal];"
elif ret_type == "void":
ret_val = ""
ret = ""
elif ret_type == "": # c-tor
constructor = True
- ret_val = "return [self initWithNativePtr:new "
- tail = "]"
+ ret_val = "return [self initWithNativePtr:cv::Ptr<" + fi.fullClass(isCPP=True) + ">(new "
+ tail = ")]"
ret = ""
elif self.isWrapped(ret_type): # wrapped class
namespace_prefix = self.get_namespace_prefix(ret_type)
- ret_val = namespace_prefix + ret_type + "* retVal = new " + namespace_prefix + ret_type + "("
+ ret_val = "cv::Ptr<" + namespace_prefix + ret_type + "> retVal = new " + namespace_prefix + ret_type + "("
tail = ")"
ret_type_dict = type_dict[ret_type]
from_cpp = ret_type_dict["from_cpp_ptr"] if ret_type_dict.has_key("from_cpp_ptr") else ret_type_dict["from_cpp"]
prologue = "\n " + "\n ".join(prologue) if prologue else "",
epilogue = "\n " + "\n ".join(epilogue) if epilogue else "",
static = "+" if static else "-",
- obj_deref = ("MAKE_PTR(" + fi.fullClass(isCPP=True) + ")->" if not ci.is_base_class else "_nativePtr->") if not static and not constructor else "",
+ obj_deref = ("self." + ci.native_ptr_name + "->") if not static and not constructor else "",
cv_name = fi.cv_name if static else fi.fullClass(isCPP=True) if constructor else fi.name,
cv_args = ", ".join(cv_args),
tail = tail
objc_type = type_data.get("objc_type", pi.ctype)
ci.addImports(pi.ctype, False)
ci.method_declarations.write("@property " + ("(readonly) " if not pi.rw else "") + objc_type + " " + pi.name + ";\n")
- ptr_ref = "MAKE_PTR(" + ci.fullName(isCPP=True) + ")->" if not ci.is_base_class else "_nativePtr->"
+ ptr_ref = "self." + ci.native_ptr_name + "->" if not ci.is_base_class else "self.nativePtr->"
if type_data.has_key("v_type"):
vector_type = type_data["v_type"]
full_cpp_type = (self.get_namespace_prefix(vector_type) if (vector_type.find("::") == -1) else "") + vector_type