C में C ++ टेम्प्लेट टाइप API का मुहावरेदार रैपिंग


9

मैं C ++ API लपेटने पर काम कर रहा हूं जो C फ़ंक्शन में डेटा स्टोर (हेज़ेलकास्ट) तक पहुंच प्रदान करता है, ताकि डेटा स्टोर को सी-ओनली कोड से भी एक्सेस किया जा सके।

मैप डेटास्ट्रक्चर के लिए हेज़ेलकास्ट सी ++ एपीआई इस तरह दिखता है:

auto map = hazelcastClient->client->getMap<int, string>(mapName);
map.put(key, value);

यह मापदंडों keyऔर valueमापदंडों के प्रकार का उपयोग करता है । चूंकि सी में कोई टेम्पलेट उपलब्ध नहीं हैं, इसलिए मैंने getMap<T, U>विधि के प्रत्येक विशेषज्ञता के लिए एक आवरण समारोह बनाने के बारे में सोचा । यही है, प्रत्येक सी प्रकार के लिए। हालांकि मुझे पता है देखते हैं कि कर रहा हूँ signedऔर unsignedसी प्रकार के संस्करणों, मैं एपीआई सीमित ही समर्थन करने के लिए के साथ ठीक हूँ int, double, float, char *के लिए keyऔर value

इसलिए मैंने एक छोटी स्क्रिप्ट लिखी, जो सभी संयोजनों को स्वतः उत्पन्न करती है। निर्यात किए गए कार्य इस तरह दिखते हैं:

int Hazelcast_Map_put_int_string(
    Hazelcast_Client_t *hazelcastClient,
    const char *mapName,
    int key,
    char *value,
    char** errptr
);

int Hazelcast_Map_put_int_int(
    Hazelcast_Client_t *hazelcastClient,
    const char *mapName,
    int key,
    int value,
    char** errptr
);

...

के लिए एक समारोह जनरेट कर रहा है get, set, containsके सभी संभव संयोजनों के साथ keyऔर valueप्रकार के कोड की मात्रा काफी एक बहुत बढ़ जाती है, और हालांकि मुझे लगता है कि कोड जनरेट एक अच्छा विचार है, यह कोड पैदा करने के बुनियादी ढांचे के कुछ प्रकार बनाने के लिए होने से अतिरिक्त जटिलता कहते हैं।

एक और विचार मैं कल्पना कर सकता हूं कि सी में एक सामान्य कार्य है, जैसे:

int Hazelcast_Map_put(
    Hazelcast_Client_t *hazelcastClient,
    const char *mapName,

    const void *key,
    API_TYPE key_type,

    const void *value,
    API_TYPE value_type,

    char** errptr
);

जिसका उपयोग इस तरह किया जा सकता है:

Hazelcast_Map_put(client, mapName, "key", API_TYPE_STR, "val", API_TYPE_STR, &err);

इससे कॉल करने वाले के लिए थोड़ा आसान हो जाता है, क्योंकि यह मेरे कोड पर सही विशेषज्ञता प्राप्त करने के बोझ को बदल देता है, लेकिन यह प्रकार की सुरक्षा खो देता है और इसके लिए कलाकारों की आवश्यकता होती है। इसके अलावा, एक इंट में पास होने के लिए, जैसा void *कि अब टाइप है keyऔर value, (void *) (intptr_t) intValकॉलर्स की तरह एक कास्ट की आवश्यकता होगी, जो फिर से पढ़ने और बनाए रखने के लिए सुपर अच्छा नहीं है।

  • क्या कोई तीसरा विकल्प है, जिसे मैं नहीं पहचान सकता?
  • सी डेवलपर्स द्वारा कौन सा संस्करण पसंद किया जाएगा?

मैं ज्यादातर सभी प्रकार के संयोजनों को ऑटो-जेनरेट करने और प्रत्येक के लिए एक फ़ंक्शन बनाने के लिए इच्छुक हूं, हालांकि हेडर फ़ाइल काफी विशाल हो जाएगी, मुझे लगता है।


कई upvotes, अभी तक कोई राय नहीं है। मैं इकट्ठा करता हूं कि यह एक सामान्य समस्या है कि C में टेम्पलेट टाइप किए गए तरीकों को कैसे लपेटा जाए?
अधिकतम

मुझे यकीन नहीं है कि यह आम है। मैंने उत्थान किया क्योंकि मुझे समस्या दिलचस्प लगती है।
मेटाफ़ाइट

संबंधित, हालांकि वास्तव में यह सब उपयोगी नहीं है: stackoverflow.com/questions/1588788/…
मार्टिन बा

जवाबों:


1

सभी संभावनाओं को उत्पन्न करना मेरे लिए बहुत अच्छा समाधान नहीं लगता था। कुंजी और मान भी ऑब्जेक्ट हो सकते हैं। इसलिए, संभावनाएं अनंत हैं :(

क्या आपके पास IMapImpl वर्ग पर एक नज़र है? यह वर्ग प्रकारों का उपयोग नहीं करता है लेकिन बाइनरी डेटा (जो क्रमबद्धता के बाद प्रदान किया जाता है)। इसलिए, एक अन्य समाधान एक एपीआई लिख रहा होगा जो इस इंटरफ़ेस की नकल करता है + एक सीरियलाइज़ेशन उपयोगिता प्रदान करता है जो किसी भी प्रकार को बाइनरी में परिवर्तित करता है जिसे इस इंटरफ़ेस की आवश्यकता होती है।

उदाहरण के लिए

एपीआई:

struct Binary {
   byte *data;
   size_t length;
   int32_t dataType;
};
Binary *hazelcast_map_put(const Binary *key, const Binary *value);

सीरियलाइजेशन उपयोगिता:

int hazelcast_binary_to_int(const Binary *data);

आपको उन सहायक प्रकारों के लिए इन सहायक कार्यों को लिखना पड़ सकता है जिन्हें आप समर्थन करना चाहते हैं। यह एक व्यवहार्य इंटरफ़ेस हो सकता है। स्मृति प्रबंधन जैसी चीजों पर विचार किया जाना है।

सीरियलाइज़ेशन एक जटिल विषय है, लेकिन आप निश्चित रूप से पहले आदिम प्रकारों का समर्थन करके शुरू कर सकते हैं। देखें http://docs.hazelcast.org/docs/3.6/manual/html-single/index.html#serialization और https://github.com/hazelcast/hazelcast/blob/master/hazelcast/src/main/java /com/hazelcast/internal/serialization/impl/ConstantSerializers.java क्रमबद्धता विवरण के लिए।


मुझे लगता है कि यह मेरे मामले के लिए रास्ता है। पाश से बाहर के लोगों के लिए, मैंने हेजलकास्ट सी ++ क्लाइंट github.com/hazelcast/hazelcast-cpp-client/pull/127 और ihsan में एक पीआर में एक ही सवाल पूछा , जो उस ++ क्लाइंट का अनुरक्षक था, इतना अच्छा था यहाँ भी एसओ पर मेरे सवाल का जवाब देने के लिए।
अधिकतम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.