How to parsing custom function in Source insight? - parsing

My function definition and prototype as below, have anyone know how to set the custom parse to link definition and prototype of FuncConnect?
Thanks.
extern FUNC(void, CODE) FuncConnect (void);
FUNC(void, CODE) FuncConnect (void)
{
// do something
}

Related

Passing reference of C++ class to an Objective C interface

I have written a Objective C++ wrapper so that I will be able to access the C++ methods in Swift.
The wrapper has a method which returns a C++ class reference.
IECMServices.h (C++ class)
namespace ECMServices
{
class IECMServices
{
public:
virtual DataServices::IParameters& getDeviceInformation(ECMServicesTypes::UINT_16 moduleID) = 0;
};
}
IECMServicesWrapper.mm (Objective C++ class)
I am getting the above error while writing the Wrapper code.
IParameters is a C++ class
OParameters is Objective C++ equivalent class for IParameters
I want to return reference of OParameters to Swift.
For that I want to pass reference of C++ class to my oParametersRef
oParametersRef = oCECMServicesProviderObj.getECMServices().getDeviceInformation(0);
"oCECMServicesProviderObj.getECMServices().getDeviceInformation(0);"
this returns reference of IParameters which is a C++ class.
So that i can access methods of IParameters(C++) in swift via OParameters(Objective C++)
I want to pass reference of C++ to Objective C++ to Swift.
Search this community site, there are many answers that address this problem. See, for example, this: How to use Superpowered lib in Swift project
The specific error message in the image is due to the fact that getDeviceInformation() returns a reference to IParameters, which is assigned to an incompatible type OParameters*, i.e. a pointer to OParameters. The code of OParameters is not given, but I would guess that converting an IParameters reference to an OParameters pointer would be tricky and unnecessary. Anyway, your OParameters class evidently does not provide such a conversion.
As you can see in the aforementioned answer, it is impossible to expose C++ code to Swift directly, and IParameters is a C++ class. Objective-C++ allows you to mix Objective-C and C++, but only the Objective-C portion of the code can be exposed to Swift through headers. So, you will need to create an Objective-C class that is populated based on the contents of an IParameters instance and returned to Swift. In addition, if you want changes made in Swift to be visible in C++, you would need to keep a pointer or a reference to IParameters in the wrapper .mm file, but NOT in any headers visible to Swift, and have setters, visible to Swift, that can be used to modify the IParameters state.
Here is a quick and dirty example. The focus here is only on sharing IParams between C++ and Swift. Things like memory management are out of scope here. For simplicity, let us say our IParams and EMC C++ classes look as follows:
class IParams {
public:
int32_t param1;
int32_t param2;
};
class ECM
{
public:
static ECM * getInstance();
// It's very important that a reference is returned here. This
// allows us to store the pointer to the referenced IParams in a
// member of OParams, and the OParams' getters and setters can then
// directly access the IParams object returned here by reference.
IParams& getDeviceInfo();
...
};
Here are their wrapper implementations in Objective-C++ (.mm) code, which refer to C++ code directly, but it's OK as this is hidden from Swift:
#implementation OParams
{
IParams * pIParams;
}
-(id)init:(IParams*)pip
{
pIParams = pip;
return self;
}
// These getters and setters directly access the memory of the IParams
// object pointed to by pIParams.
-(int32_t)getParam1 { return pIParams->param1; }
-(int32_t)getParam2 { return pIParams->param2; }
-(void)setParam1:(int32_t)p { pIParams->param1 = p; }
-(void)setParam2:(int32_t)p { pIParams->param2 = p; }
#end
#implementation ECMWrapper
-(OParams*)getDeviceInfo
{
// We're returning a pointer to an OParams instance whose pIParams
// member points to the IParams object the reference to which is
// returned from ECM::getDeviceInfo()
return [[OParams alloc] init:(&ECM::getInstance()->getDeviceInfo())];
}
#end
Finally, here are the declarations that are visible to Swift, directly or indirectly, via the bridging header:
#interface OParams : NSObject
-(int32_t)getParam1;
-(int32_t)getParam2;
-(void)setParam1:(int32_t)p;
-(void)setParam2:(int32_t)p;
#end
#interface ECMWrapper : NSObject
-(OParams*)getDeviceInfo;
#end
Note that no C++ types or methods are mentioned here, so this code can be used in Swift.

Swift and method prototype - forward declaration

Exploring Swift headers I'm seeing this pattern used by Apple, in particular the init declaration of the following struct HAS NO IMPLEMENTATION.
Obviously the init() implementation is hidden somehow, since it's Apple stuff, but I was trying to understand how.
This is only an example, but it seems a common behavior in the headers
struct AutoreleasingUnsafePointer<T> : Equatable, LogicValue {
let value: Builtin.RawPointer
init(_ value: Builtin.RawPointer) // <---- how is it possible? where is the implementation?
func getLogicValue() -> Bool
/// Access the underlying raw memory, getting and
/// setting values.
var memory: T
}
I know that it is possible to declare a protocol plus a class extension, doing this it's possible to "hide" the implementation from the class declaration and moving it elsewhere
class TestClass :TestClassProtocol
{
// nothing here
}
protocol TestClassProtocol
{
func someMethod() // here is the method declaration
}
extension TestClass
{
func someMethod() // here is the method implementation
{
println("extended method")
}
}
But it's different from what I have seen in the Apple Headers, since the method "declaration" is inside the "class", not inside the "protocol". if I try to put the method declaration inside the class TestClass, however, I have two errors (function without body on the class, and invalid redeclaration on the extension)
In Objective C this was "implicit", since the method declaration was in the .h and the implementation in the .m
How to do the same in Swift?
I think the explanation is very simple. What you see in Xcode is not actually a valid Swift
code.
It's a result from an automatic conversion of an Obj-C header into Swift-like code but it's not compilable Swift.

GCD Queue Incompatible Type Error

Alright, this is my first post and am still rather new at objective-c, but here it goes:
I am currently creating a project that will create a second queue to generate a bunch of NSTimers and set them off. Since I don't want to halt the main queue, I figured Grand Central Station was the best route.
Currently, I have a UIButton that performs the following action:
- (IBAction)runTest:(id)sender {
if (!timerQueue) {
timerQueue = dispatch_queue_create("com.myApp.timerQueue", DISPATCH_QUEUE_SERIAL);
}
dispatch_async(timerQueue, ^{[self initiateTest];});
and then...
- (void) initiateTest {
// code to generate timers and execute
}
The header file associated with the viewController where this all happens looks like this:
#interface ViewController : UIViewController <SomeOtherMgrDelegate> {
dispatch_block_t timerQueue;
}
...
- (IBAction)runTest:(id)sender;
- (void) initiateTest;
The issue seems to be with regards to the line
timerQueue = dispatch_queue_create("com.myApp.timerQueue", DISPATCH_QUEUE_SERIAL);
Which generates a rather long-winded semantic issue that reads:
Assigning to '__strong dispatch_block_t' (aka 'void (^__strong)(void)') from incompatible type 'dispatch_queue_t' (aka 'NSObject *')
Any idea why this error might be generating? It seemed in the documentation that this was the correct way to go about it.
Thanks; and let me know if there is anything else in my code that might be useful to see!
EDIT: So this was a rather dumb mistake, but for others: make sure the types match up (blocks /= queues!). The .h file associated with the viewController SHOULD look like this:
#interface ViewController : UIViewController <SomeOtherMgrDelegate> {
dispatch_queue_t timerQueue; // This is where the problem was.
}
...
- (IBAction)runTest:(id)sender;
- (void) initiateTest;
You declared timerQueue as an instance of dispatch_block_t, when it should be dispatch_queue_t, the return type of dispatch_queue_create()
Read the error. Look at the docs for the return value of dispatch_queue_create. And finally look at how you declared timerQueue. It's the wrong type.
You need:
#interface ViewController : UIViewController <SomeOtherMgrDelegate> {
dispatch_queue_t timerQueue;
}

Get Class from External Library's Binary

Is it possible to get a class from an external library's binary in ObjC?
Like i kno the name of the class, and im just tryna test a view to see if its a type of class
ive tried forward declarations, but that didnt work
for instance:
if([subview isKindOfClass:[ExternalBinaryView class]])
{
ExternalBinaryView* _foo = subview;
}
thanks for the help in advance
If the header files aren't supplied use NSClassFromString.
if([subview isKindOfClass:NSClassFromString(#"ExternalBinaryView")])
{
ExternalBinaryView* _foo = subview;
}
Import the header file for that class:
#import <LibraryName/ExternalBinaryView.h>
Or if there's a common header to import everything:
#import <LibraryName/LibraryName.h>
Your code should then work as expected.

how do I make an objective-c delegate for a cpp class?

I'm stuck trying to combine openGL-es (xcode openGL game template with the ogles2tools library from powervr 3.0 sdk. My problem is the line of code where I load the effect file:
/*
Load the effect.
We pass 'this' as an argument as we wish to receive callbacks as the PFX is loaded.
This is optional and supplying NULL implies that the developer will take care
of all texture loading and binding to to the Effect instead.
*/
if(m_pEffect->Load(*m_pEffectParser, "Effect", c_szPfxFile, NULL, uiUnknownUniforms, &error) != PVR_SUCCESS)
{
NSLog(#"%s",error.c_str());
return;
}
I'm supposed to pass a "this" pointer so I can receive the callbacks. The delegate method I need to implement is:
EPVRTError OGLES2IntroducingPFX::PVRTPFXOnLoadTexture(const CPVRTStringHash& TextureName, GLuint& uiHandle, unsigned int& uiFlags)
{
/*
This is an optional callback function for PVRTPFXEffect and can be used to automate
the texture loading process.
If multiple effects are to be loaded and they share textures it would be
prudent to have a caching system in place so texture memory is not wasted.
Please see OGLES2MagicLantern for an example of this.
*/
if(PVRTTextureLoadFromPVR(TextureName.String().c_str(), &uiHandle) != PVR_SUCCESS)
return PVR_FAIL;
return PVR_SUCCESS;
}
I guess the big issue for me is how do I go about providing a cpp delegate method in objective-c? I did some reading on this issue, but it seemed what I was reading was going the other way. That is, an objective-c delegate in cpp. It's pretty confusing, but here's my thought...
I create a cpp class the implements the method I need. I add that to my viewController class and pass the pointer to this cpp class in the m_pEffect->Load call. Does this seem correct?
Thanks.
P.S. Sorry if my code formatting is bad. I'm still learning.
Edit: Here's the example I found regarding mixing the objective-c and cpp. It seems really similar to what I want to do.
Update: Here's some additional info (requested by user1118321)
The CPP class which needs a delegate is CPVRTPFXEffect (PVRTPFXParserAPI.h - from powerVR SDK 3.0). I would add a link, but I'm not sure if this is allowed. Here's a link to the class header, but this version (and others on the web) did not include the pDelegate attribute for the load method. I'm assuming they are examples of a previous version. Let me know if it's okay to post this class file and I will do so.
I found a good example of what I think I'm supposed to do from reading this thread. So here's what I have so far:
My CPP delegate class...
class myCppDelegate : public PVRTPFXEffectDelegate {
public:
myCppDelegate() {};
EPVRTError PVRTPFXOnLoadTexture(const CPVRTStringHash& TextureName, GLuint& uiHandle, unsigned int& uiFlags) {
return PVR_FAIL;
};
};
My Obj-C wrapper class (just modified from the example link above)...
struct RNWrapOpaque;
#interface RNWrap : NSObject {
struct RNWrapOpaque *_cpp;
}
- (id)init;
#end
implementation...
#import "RNWrap.h"
#import "Wrap.h"
#interface RNWrap ()
#property (nonatomic, readwrite, assign) RNWrapOpaque *cpp;
#end
#implementation RNWrap
#synthesize cpp = _cpp;
struct RNWrapOpaque
{
public:
RNWrapOpaque() : wrap() {};
myCppDelegate wrap;
};
- (id)init
{
self = [super init];
if (self != nil)
{
self.cpp = new RNWrapOpaque();
}
return self;
}
- (void)dealloc
{
delete _cpp;
_cpp = NULL;
// [super dealloc];
}
#end
Basically I am able to compile the code and debug, but when the the CPVRTPFEffect class makes this call:
if(pDelegate->PVRTPFXOnLoadTexture(pTexDesc->FileName, uiHandle, uiFlags) != PVR_SUCCESS)
I get EXC_BAD_ACCESS. I'm assuming it's not finding my callback method, because I set a breakpoint and the line never gets called.
Here's my updated code which calls CPVRTPFXEffect::Load using a bridge command for the delegate parameter.
if(m_pEffect->Load(*m_pEffectParser, "Effect", c_szPfxFile,(__bridge myCppDelegate*)opaqueCppWrap, uiUnknownUniforms, &error) != PVR_SUCCESS)
Thanks for your help!
Update 2: The project uses ARC. Here's what my viewController interface looks like:
#interface ViewController : GLKViewController {
...
RNWrap* opaqueCppWrap;
...
}
#property (strong) RNWrap *opaqueCppWrap;
Adding the #property didn't help with the EXC_BAD_ACCESS. I'm not sure how to "see" the value of pDelegate when I'm tracing the CPP code. Xcode doesn't reveal anything when I hover over the variable.
I added the following line of code to the CPVRTPFXEffect::Load method (just prior to the line where it crashes):
*pReturnError += PVRTStringFromFormattedStr("Here is your class typeid: %s.\n", typeid(pDelegate).name());
return PVR_FAIL;
This is what displayed in the debug output window:
Here is your class typeid: P21PVRTPFXEffectDelegate.
I'm not sure what the "P21" means (if anything), but it looks like I'm close to getting this working. I dunno, maybe this is as close as it gets. Still crashing and not finding my method.
First, you may want to look at the last article in the series on wrapping C++. Most of it has gotten much simpler in the latest versions of clang. You probably don't need half this code anymore. ObjC++ objects can now have private C++ properties without any tricks, while maintaining a pure-ObjC interface.
Here is how you want to think about this problem:
Build a C++ object that is the delegate. Write all the code involved in setting up the delegation, etc, in C++. So when it says "pass a this pointer" you should really be passing a this pointer (because you should be doing this in the C++ code). The fact that you're doing a _bridge cast in a C++ call is a real hint something is going wrong.
Let an ObjC own the C++ object as a property.
Write the delegate callbacks in C++ inside the C++ object. If useful, you can let the C++ object then make calls into the ObjC object as needed, but it may be easier if the C++ object does all the delegate work.
I finally got this working, but had to remove the obj-c wrapper class from my viewController in order to do so. Here's what the code looks like:
ViewController.h
struct Opaque;
#interface ViewController : GLKViewController {
...
//RNWrap* opaqueCppWrap; // this didn't work
struct Opaque *opaqueCpp; // try this
...
}
ViewController.mm
// declare the Opaque structure
struct Opaque {
public:
Opaque() : cppobject() {};
myCppDelegate cppobject;
};
viewDidLoad
// ... create opaque member on initialization
opaqueCpp = new Opaque();
//opaqueCppWrap = [[RNWrap alloc] init]; // old way of doing things using wrapper
pass the delegate to the Load method
// old way using bridge cast and wrapper
//if(m_pEffect->Load(*m_pEffectParser, "Effect", c_szPfxFile,(__bridge myCppDelegate*)opaqueCppWrap, uiUnknownUniforms, &error) != PVR_SUCCESS)
// this works...
if(m_pEffect->Load(*m_pEffectParser, "Effect", c_szPfxFile, (myCppDelegate*)opaqueCpp, uiUnknownUniforms, &error) != PVR_SUCCESS)
Not sure why the wrapper class doesn't work, but I'm happy that my callback is working (appy no crashy!)
Phew, that was rough. Any thoughts/comments?

Resources