digitalmars.D.learn - best D way to port C style array of void*
- estew (24/24) Feb 05 2013 Hi All,
- Steven Schveighoffer (27/44) Feb 05 2013 That is probably what I would recommend. Although I would consider
- Steven Schveighoffer (8/25) Feb 05 2013 Forgot to say, the output here would be:
- estew (10/10) Feb 05 2013 Thanks for your help, much appreciated.
- Jacob Carlborg (5/9) Feb 05 2013 I would suggest you try to replace the array with something more typed,
- Michael (3/3) Feb 06 2013 Just a note. Be careful with void* pointers. In D it have a 32bit
Hi All, I've some old C code which I'm porting to D. It's a learning exercise so I don't want to just wrap the C lib. I have an array of void* and an array of callbacks that take void* pointers for user data. I'm wondering what is a good way to port this into D and avoid the void*. My C++ version uses std::function<> for the callbacks and functors. I'm using std::vector<boost::any> For the array of void*. Maybe it's not the best approach but it's my best efforts. For the D port I'd like to improve on the C++ approach and I'd love to know a better way to do it. * Could I replace the boost::any with an array of Variant from std.variant? * Can I assign a struct with opCall() to a function pointer, similar to how std::function<> can take a struct with an operator(). * Should I forget functors and use a callback that takes a std.variant (or whatever the boost::any like thing in D is) instead of void*? * What would be the best approach do you think to replace use of void* like this. Thanks, Stewart
Feb 05 2013
On Tue, 05 Feb 2013 22:16:17 -0500, estew <estewh gmail.com> wrote:Hi All, I've some old C code which I'm porting to D. It's a learning exercise so I don't want to just wrap the C lib. I have an array of void* and an array of callbacks that take void* pointers for user data. I'm wondering what is a good way to port this into D and avoid the void*. My C++ version uses std::function<> for the callbacks and functors. I'm using std::vector<boost::any> For the array of void*. Maybe it's not the best approach but it's my best efforts. For the D port I'd like to improve on the C++ approach and I'd love to know a better way to do it. * Could I replace the boost::any with an array of Variant from std.variant?That is probably what I would recommend. Although I would consider altering the design to avoid this. D has a much better type system than C or C++.* Can I assign a struct with opCall() to a function pointer, similar to how std::function<> can take a struct with an operator(). * Should I forget functors and use a callback that takes a std.variant (or whatever the boost::any like thing in D is) instead of void*?Use a delegate. A delegate is a function call with a context pointer. No need to specify the type of the pointer, it's whatever type it needs to be. You can create a delegate just about anywhere. It can be a member function of a class or struct, or an internal function, or a lambda function (D supports closures). e.g.: import std.stdio; void callit(void delegate() dg) { // call delegate with context pointer dg(); } void main() { int x; auto dg = ()=>writeln(++x); // create a delegate using a lambda function callit(dg); callit(dg); callit(dg); callit(dg); } -Steve
Feb 05 2013
On Tue, 05 Feb 2013 23:17:59 -0500, Steven Schveighoffer <schveiguy yahoo.com> wrote:e.g.: import std.stdio; void callit(void delegate() dg) { // call delegate with context pointer dg(); } void main() { int x; auto dg = ()=>writeln(++x); // create a delegate using a lambda function callit(dg); callit(dg); callit(dg); callit(dg); }Forgot to say, the output here would be: 1 2 3 4 -Steve
Feb 05 2013
Thanks for your help, much appreciated. I'm using the delegates now for the callbacks. At your suggestion I'm looking for a good way to change the design. I agree, the D type system is way superior to that of C. Starting to get into mixins too, although I'm a bit wary of them. I know they're not macros, but I once had to debug (and eventually rewrote) ~5000 lines of macros that calculate interpolated XYZ values...still recovering :) Cheers, Stewart
Feb 05 2013
On 2013-02-06 06:49, estew wrote:Thanks for your help, much appreciated. I'm using the delegates now for the callbacks. At your suggestion I'm looking for a good way to change the design. I agree, the D type system is way superior to that of C.I would suggest you try to replace the array with something more typed, if possible. -- /Jacob Carlborg
Feb 05 2013
Just a note. Be careful with void* pointers. In D it have a 32bit length on x86 machines and 64bit length on x86_64 machines. Probaly in C with different compilers it's may vary.
Feb 06 2013