You mean embind in combination with using std::vector? And you mention I have to use >>2 myself. I know that if byteSize == 4 then doing a right bit shift operator divides the value it shifts by 2 but why is this necessary?
Thanks for your answers and help, it is really much appreciated. On 26 October 2016 at 20:45, Alon Zakai <[email protected]> wrote: > Yeah, that's close to how I'd do it, when writing for performance > (otherwise, embind might be more concise). > > You can replace the EM_ASM_INT with a direct call to malloc, though. > > And instead of getValue, accessing the typed array directly is much faster > (Module.HEAP32[buffer + i*nByte >> 2], note that you need to do the >>2 > yourself manually). > > On Wed, Oct 26, 2016 at 11:35 AM, Philipp Gloor <[email protected]> > wrote: > >> I see. >> If you have a function that on the C++ side returns a double array, what >> would be your preferred way to make this accessible in JS? I don't know the >> length of the array beforehand. >> >> I played around with EM_ASM_INT. >> >> JSHelper fillRandomArray() >> { >> int len = rand()%10 + 10; >> int pointer = EM_ASM_INT({ >> var buffer = Module._malloc($0 * 4); >> return buffer; >> }, len); >> int* a = (int*)pointer; >> for (int i = 0; i < len-1; i++) >> { >> a[i] = i*3; >> } >> JSHelper js; >> js.pointer = pointer; >> js.length >> return js; >> } >> >> and in my .js file >> >> var nByte = 4; >> var charByte = 1; >> var jsInfo = Module.fillRandomArray(); >> var buffer = jsInfo.pointer; >> for (var i = 0; i < jsInfo.length; i++) >> { >> console.log(Module.getValue(buffer + i*nByte, 'i32')); >> } >> >> This works but this seems a bit too complicated for something (seemingly) >> simple. I've also tried a version where I return just a std::vector which >> works just fine but our C++ code base tries to avoid using STL for some >> reasons. Is this a reasonable solution? >> >> >> On Wednesday, 26 October 2016 19:37:06 UTC+2, Alon Zakai wrote: >>> >>> It depends what you mean. A pointer in emscripten (in general) is just >>> an integer. So it's fine to pass pointers into and out of compiled code, >>> including WebIDL glue. The WebIDL glue does add functionality on top, by >>> converting a return value of a wrapped class into a JS object wrapper. It >>> also handles an input parameter that is a JS object wrapper, converting it >>> into the integer for the compiled method underneath (it's also fine to just >>> pass that integer as a parameter). >>> >>> On Tue, Oct 25, 2016 at 10:32 PM, Philipp Gloor <[email protected]> >>> wrote: >>> >>>> OK thanks. And did I understand correctly that pointers only work for >>>> non-primitive data types? >>>> >>>> On 26 October 2016 at 00:11, Alon Zakai <[email protected]> wrote: >>>> >>>>> Yes, WebIDL focuses on simple types that map directly to JS (numbers, >>>>> pointers, etc). embind has more functionality for sophisticated mappings >>>>> of >>>>> C++ classes, like std::vector. >>>>> >>>>> On Tue, Oct 25, 2016 at 2:39 PM, Philipp Gloor <[email protected]> >>>>> wrote: >>>>> >>>>>> I have a C++ function that should return a vector of doubles but on >>>>>> the WebIDL doc page >>>>>> <https://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/WebIDL-Binder.html> >>>>>> I >>>>>> found nothing that could help me. >>>>>> >>>>>> The header file: >>>>>> >>>>>> #ifndef __JSAPI_H__ >>>>>> #define __JSAPI_H__ >>>>>> >>>>>> #include <string> >>>>>> #include "annotation.h" >>>>>> >>>>>> class JSAPI >>>>>> { >>>>>> Annotation* annotations; >>>>>> public: >>>>>> char* getAnnotContent(int annotID); >>>>>> std::vector<double> getAnnotRect(int annotID); >>>>>> >>>>>> }; >>>>>> >>>>>> #endif >>>>>> >>>>>> And the implementation >>>>>> >>>>>> #include "jsapi.h" >>>>>> >>>>>> >>>>>> char* JSAPI::getAnnotContent(int annotID) >>>>>> { >>>>>> return annotations[annotID].content; >>>>>> } >>>>>> >>>>>> std::vector<double> JSAPI::getAnnotRect(int annotID) >>>>>> { >>>>>> return annotations[annotID].rect; >>>>>> } >>>>>> >>>>>> And I'm looking for the proper definition of >>>>>> >>>>>> interface JSAPI >>>>>> { >>>>>> void JSAPI(); >>>>>> DOMString getAnnotContent(long annotID); >>>>>> std::vector<double> getAnnotRect(long annotID); >>>>>> }; >>>>>> >>>>>> Is something like this even possible? Or do I need to switch to >>>>>> embind for this? >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "emscripten-discuss" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to [email protected]. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> -- >>>>> You received this message because you are subscribed to a topic in the >>>>> Google Groups "emscripten-discuss" group. >>>>> To unsubscribe from this topic, visit https://groups.google.com/d/to >>>>> pic/emscripten-discuss/18GjJeGOq08/unsubscribe. >>>>> To unsubscribe from this group and all its topics, send an email to >>>>> [email protected]. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "emscripten-discuss" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "emscripten-discuss" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> > > -- > You received this message because you are subscribed to a topic in the > Google Groups "emscripten-discuss" group. > To unsubscribe from this topic, visit https://groups.google.com/d/ > topic/emscripten-discuss/18GjJeGOq08/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
