আমি একটি সি ++ এপিআই মোড়ানোর কাজ করছি যা সি ফাংশনগুলিতে একটি ডেটা স্টোর (হ্যাজেলকাস্ট) অ্যাক্সেস সরবরাহ করে, যাতে ডেটা স্টোরটিও কেবল সি-কোড থেকে অ্যাক্সেস করা যায়।
মানচিত্রের ডেটাস্ট্রাকচারের জন্য হ্যাজেলকাস্ট সি ++ এপিআই দেখতে এই রকম দেখাচ্ছে:
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
, কলারদের পক্ষের মতো একটি কাস্ট প্রয়োজন হবে, যা আবার পড়তে এবং বজায় রাখতে খুব সুন্দর নয়।
- কোন তৃতীয় বিকল্প আছে, যা আমি চিনতে পারি না?
- সি বিকাশকারীরা কোন সংস্করণ পছন্দ করবেন?
আমি বেশিরভাগ ক্ষেত্রে সমস্ত ধরণের সংমিশ্রণগুলি স্বয়ংক্রিয়ভাবে উত্পন্ন করতে এবং প্রতিটিটির জন্য একটি ফাংশন তৈরি করতে আগ্রহী, যদিও শিরোনাম ফাইলটি আমার ধারণা হিসাবে যথেষ্ট বিশাল হয়ে উঠবে।