لوا برج

Luabridge



بیس کلاس کو براہ راست انکشاف نہیں ، بیس کلاس کو علیحدہ علیحدہ کرکے وراثت کا اعلان کرنا ہے

deriveClass ('پلیئر')



بیس کلاس کی براہ راست تقریب کا انکشاف N بار دیا جائے گا !!!!! قدم رکھنے والی گڑھے کی تصاویر !!!!!!!!!!!!






لوا برج کی اہم خصوصیات
صرف ماخذ ہیڈر ، کوئی .cpp فائل ، کوئی میک فائل ، استعمال کرنے کے لئے صرف # شامل نہیں۔
مختلف آبجیکٹ لائف سائیکل انتظامیہ کی حمایت کریں۔
آسان رسائی اور محفوظ قسم (ٹائپ سیف) کیلئے لوا اسٹیک۔
خودکار فنکشن پیرامیٹر کی قسم کا پابند ہونا۔
لیوا اشیاء جیسے میزیں اور افعال تک آسان رسائی۔
LuaBridge API C ++ ٹیمپلیٹ میٹاپگرامگرامنگ (ٹیمپلیٹ میٹاپگرامگرامنگ) پر مبنی ہے۔ یہ ٹیمپلیٹس خود بخود مختلف قسم کے LUA API کالز مرتب کرتے ہیں ، جو اس کے بعد پروگرام میں C ++ کلاسز اور افعال کا استعمال کرتے ہوئے LUA اسکرپٹ کرسکتے ہیں۔ LuaBridge LuaRef کلاس کا استعمال کرتے ہوئے C ++ ، جیسے نمبر ، اسٹرنگ ، ٹیبل لوا اور ایزی کال فنکشن جیسے Lua ڈیٹا کو استعمال کرنے کے ل it ، یہ آسانی سے کیا جاسکتا ہے۔
لوا برج ڈیزائن اصول
چونکہ لیو برج ڈیزائن کے اہداف کو ہر ممکن حد تک استعمال کرنا آسان ہے ، جیسے صرف ہیڈر فائلوں نے ، اعلی سطح کے C ++ نحو کا استعمال نہیں کیا اور اس کی تشکیل کی ضرورت نہیں ہے۔ لہذا لوا برج کی کارکردگی کافی اچھی ہے ، لیکن بہترین نہیں ، جیسے اوولوا (https://code.google.com/p/oolua/) اس پر عملدرآمد کی کارکردگی بہتر ہے ، اور یہ LuaBind بھی نہیں ہے (HTTP: // www .rasterbar.com / product / luabind.html) مکمل خصوصیات کے بطور لوا برج مندرجہ ذیل خصوصیات کی حمایت نہیں کرتا ہے۔
گنتی مستقل
آٹھ سے زیادہ فنکشن پر کال کریں یا طریقہ کار معاون نہیں ہے
اوورلوڈڈ افعال ، طریقے اور کنسٹرکٹر (اوورلوڈڈ افعال ، طریقے ، یا کنسٹرکٹر)
عالمی متغیرات (متغیرات کو ایک نام کی جگہ میں پیک کرنا چاہئے)
خود بخود ایس ٹی ایل کنٹینر کی اقسام اور ٹیبل میں تبدیل ہوگیا
لوا میں وارث C ++ کلاسز (C ++ کلاس سے Lua کی کلاسیں حاصل کرنا)
کسی C ++ فنکشن میں کامیابی کے ساتھ گزرنا جو کسی پوائنٹر یا حوالہ کی توقع کرتا ہے
معیاری کنٹینرز جیسے ایس ٹی ڈی :: شیئرڈ_پٹر
سی ++ میں لوا رسائی
لوا میں C ++ ڈیٹا اور افعال استعمال کرنے کے لئے ، لوا برج کو اعداد و شمار کو رجسٹرڈ کرنے کی ضرورت کی ضرورت ہے۔ لوا برج مندرجہ ذیل پانچ اقسام کے ڈیٹا کو رجسٹر کرسکتا ہے۔
نام کے مقامات لوا ٹیبل میں اندراج کی اضافی معلومات شامل ہیں
ڈیٹا عالمی متغیرات یا جامد متغیرات ، ڈیٹا ممبرز یا جامد ڈیٹا ممبرز
افعال عام فعل ، ممبر کی تقریب یا مستحکم رکن کی تقریب
سی فنکشنز ایک باقاعدہ فنکشن ، ممبر فنکشن ، یا مستحکم ممبر فنکشن جو lua_CFunction کالنگ کنونشن کا استعمال کرتا ہے
پراپرٹیز عالمی خصوصیات ، پراپرٹی ممبر اور جامد املاک کے ممبران۔ یہ لوا کے اعداد و شمار کی طرح ظاہر ہوتے ہیں ،
لیکن اقدار کو حاصل کرنے اور مرتب کرنے کے لئے افعال کا استعمال کرتے ہوئے C ++ میں لاگو ہوتے ہیں۔


پراپرٹیز اور ڈیٹا کو اندراج کے وقت صرف پڑھنے کے لئے نشان لگا دیا گیا ہے۔ یہ کانسٹ سے مختلف ہے ، ان اشیاء کی قدر کو C ++ میں تبدیل کیا جاسکتا ہے ، لیکن لوا میں اسکرپٹ میں ترمیم نہیں کی جاسکتی ہے۔


نام کی جگہیں
انڈیکس میں رجسٹرڈ لیو برج نام کے مقام میں ہیں ، لوا نقطہ نظر سے نام کی جگہ ، یہ لازمی طور پر جدول ہے ، یہاں توجہ دینا نام کی جگہ میں C ++ نام کی جگہ نہیں ہے ، C ++ نام کی جگہ ضروری نہیں ہے۔ نام کی جگہ لوا اسکرپٹ کے لئے لوا برج ہے ، جو منطقی امتزاج کے آلے (منطقی گروپ بندی کے آلے) کے طور پر استعمال ہوتا ہے۔ لوا عالمی نام کی جگہ (عالمی نام کی جگہ) تک رسائی حاصل کرنے کے ل C ، آپ C ++ میں ، یہ کال کر سکتے ہیں:
int globalVar static float staticVar std::string stringProperty std::string getString () { return stringProperty } void setString (std::string s) { stringProperty = s } int foo () { return 42 } void bar (char const*) { } int cFunc (lua_State* L) { return 0 } مذکورہ کال ایک آبجیکٹ کو واپس کرتی ہے (جوہر میں ، ٹیبل) مزید رجسٹر کرنے کیلئے استعمال ہوسکتی ہے ، جیسے کہ:
test -- a namespaceIn essence is a table, the table below are the members of test.var1 -- a lua_Number variable test.var2 -- a read-only lua_Number variable test.prop1 -- a lua_String property test.prop2 -- a read-only lua_String property test.foo -- a function returning a lua_Number test.bar -- a function taking a lua_String as a parameter test.cfunc -- a function with a variable argument list and multi-return مندرجہ بالا کال لوا میں _G میں 'ٹیسٹ' نامی ایک ٹیبل بنائے گی ، یہ ٹیبل اب خالی ہے۔ LUABridge تمام ڈبل انڈر سکور نام کی شناخت کے ساتھ شروع کرتا ہے ، لہذا ___ غلط نام ہے ، اگرچہ اس کا نام لیاوا برج غلطی نہیں ہے۔ ہم اوپر درج رجسٹرڈ کو مزید بڑھا سکتے ہیں:
test.var1 = 5 -- okay test.var2 = 6 -- error: var2 is not writable test.prop1 = 'Hello' -- okay test.prop1 = 68 -- okay, Lua converts the number to a string. test.prop2 = 'bar' -- error: prop2 is not writable test.foo () -- calls foo and discards the return value test.var1 = foo () -- calls foo and stores the result in var1 test.bar ('Employee') -- calls bar with a string test.bar (test) -- error: bar expects a string not a table اس طرح کی رجسٹریشن کے بعد ، ہم لوا میں ٹیسٹ ، ٹیسٹ.ڈیٹیل ، اور ٹیسٹ.یوٹیلیٹی کا استعمال کرسکتے ہیں۔ یہاں انڈ نیس اسپیس فنکشن متعارف کرایا گیا ، کسی شے کو بھی لوٹاتا ہے (اصل شرائط میں بھی ٹیبل) ، اس شے کا جوہر میں ایک پرت نام کی جگہ ، موجودہ نام کی جگہ کی رجسٹریشن مکمل ہونے کی نمائندگی کرتی ہے۔ تمام لوا برج افعال جو رجسٹریشن بناتے ہیں وہ ایک ایسی چیز لوٹاتے ہیں جس پر بعد میں اندراجات ہوسکتے ہیں ، جس سے ڈاٹ آپریٹر کا استعمال کرتے ہوئے لامحدود تعداد میں رجسٹریوں کا سلسلہ بند کیا جاسکتا ہے۔ نام کی جگہ میں ، اسی برنامے کی اشیاء کی رجسٹریشن ، لیو برج کے ل for غیر متعین طرز عمل ہے۔ مزید ممبروں کو شامل کرنے کے لئے نام کی جگہ کئی بار استعمال کی جاسکتی ہے۔ مندرجہ ذیل مثال دو کوڈ کے مترادف ہے۔
class A { public: A() { printf('A constructor ')} static int staticData static int getStaticData() {return staticData} static float staticProperty static float getStaticProperty () { return staticProperty } static void setStaticProperty (float f) { staticProperty = f } static int staticCFunc (lua_State *L) { return 0 } std::string dataMember char dataProperty char getProperty () const { return dataProperty } void setProperty (char v) { dataProperty = v } void func1 () {printf('func1 In Class A ') } virtual void virtualFunc () {printf('virtualFunc In Class A ') } int cfunc (lua_State* L) { printf('cfunc In Class A ') return 0 } } class B : public A { public: B() { printf('B constructor ')} double dataMember2 void func1 () {printf('func1 In Class B ') } void func2 () { printf('func2 In Class B ') } void virtualFunc () {printf('virtualFunc In Class B ') } } int A::staticData = 3 float A::staticProperty = 0.5 ساتھ
local AClassObj = test.A () --create class A instance print('before:',test.A.staticData) -- access class A static member test.A.staticData = 8 -- modify class A static member print('after:',test.A.staticData) print('before:', test.A.getStaticProperty()) --test.A.staticProperty = 1.2 --error:can not modify print('staticCFunc') test.A.staticCFunc() AClassObj.data = 'sting' print('dataMember:',AClassObj.data) AClassObj.prop = 'a' print('property:',AClassObj.prop) AClassObj:func1() AClassObj:virtualFunc() AClassObj:cfunc() BClassObj = test.B() BClassObj:func1() BClassObj:func2() BClassObj:virtualFunc() ڈیٹا ، پراپرٹیز ، افعال ، اور CFunitions
ڈیٹا ، پراپرٹیز ، افعال ، اور CFunitions رجسٹریشن کے ل add addVariable ،، addProperty، addFunction اور addCFunction کا استعمال کرسکتے ہیں۔ لوا اسکرپٹ میں فنکشن کال کو رجسٹر کرتے وقت ، لوا برج خود بخود مناسب پیرامیٹرز ، اور پیرامیٹر کی اقسام کو فارورڈنگ اور معائنہ کرکے گزرے گا۔ اسی طرح ، واپسی کی قیمت پر خود بخود کارروائی ہوگی۔ موجودہ لوا برج 8 پیرامیٹرز کو سنبھال سکتا ہے۔ پیرامیٹرز کی حیثیت سے اشارے ، حوالہ جات اور کلاس ٹائپ کے اشیاء کو خاص طور پر برتا جاتا ہے۔ اگر ہماری C ++ میں درج ذیل تعریفیں ہیں:
A constructor before: 3 after: 8 before: 0.5 staticCFunc dataMember: sting property: a func1 In Class A virtualFunc In Class A cfunc In Class A A constructor B constructor func1 In Class B func2 In Class B virtualFunc In Class B ان متغیرات اور افعال کو لوا میں استعمال کرنے کے ل we ، ہم انہیں درج ذیل طریقے سے رجسٹر کرسکتے ہیں۔
void useStateAndArgs (int i, std::string s, lua_State* L) getGlobalNamespace (L).addFunction ('useStateAndArgs', &useStateAndArgs) رجسٹریشن کے وقت متغیر ، دوسرا پیرامیٹر غلط ہے ، اس بات کو یقینی بنائیں کہ لوا میں متغیرات کو تبدیل نہیں کیا جاسکتا ، پہلے سے طے شدہ دوسرا پیرامیٹر درست ہے۔ رجسٹریشن کے وقت پراپرٹیز ، اگر ٹرانسفر فنکشن سیٹ ہوجاتا ہے ، تو وہ اسکرپٹ میں صرف پڑھنے کے قابل ہوتا ہے۔
مذکورہ بالا کے ذریعے اندراج کے بعد ، لوا میں درج ذیل اظہارات درست ہیں:
func0 (a) -- Passes a copy of a, using A's copy constructor. func1 (a) -- Passes a pointer to a. func2 (a) -- Passes a pointer to a const a. func3 (a) -- Passes a reference to a. func4 (a) -- Passes a reference to a const a. متغیر کے ساتھ سی ++ میں ٹیسٹ.پروپ 1 اور ٹیسٹ.پروپ 2 حوالہ جات ، پھر test.prop2 صرف پڑھنے کے قابل ہے ، لہذا اسکرپٹ میں test.prop2 اسائنمنٹس ، رن ٹائم غلطی کا سبب بنے گی (رن ٹائم) غلطی) لوا درج ذیل طریقے سے:
func5 (b) - Passes a copy of b, using B's copy constructor. func6 (b) - Passes a pointer to b. func6 (a) - Error: Pointer to B expected. func1 (b) - Okay, b is a subclass of a.
کلاس آبجیکٹ
رجسٹریشن کی شروعات کلاس یا ڈیریوکلاس کلاس اختتام کلاس اختتام سے شروع ہوئی۔ کلاس رجسٹریشن کے بعد ، دوبارہ رجسٹریشن کا استعمال بھی شروع کلاس مزید معلومات میں کیا جاسکتا ہے ، لیکن ڈیریو کلاس صرف ایک بار استعمال کیا جاسکتا ہے۔ مزید معلومات رجسٹرڈ ، ڈرائیو کلاس کلاس کے ساتھ اندراج کروانے کے ل you ، آپ بیگنکلاس کا استعمال کرسکتے ہیں۔
getGlobalNamespace (L)
مندرجہ ذیل کے طور پر رجسٹر ہوں:
 getGlobalNamespace (L) .beginNamespace ('test')
رجسٹریشن کے بعد ، پھر آپ لوا اسکرپٹ کلک موڈ استعمال کرسکتے ہیں:
 getGlobalNamespace (L) .beginNamespace ('test') .beginNamespace ('detail') .endNamespace () .beginNamespace ('utility') .endNamespace () .endNamespace ()

اس کی پیداوار ہے:
 getGlobalNamespace (L) .beginNamespace ('test') .addFunction ('foo', foo) .endNamespace () getGlobalNamespace (L) .beginNamespace ('test') .addFunction ('bar', bar) .endNamespace ()
کلاس رجسٹریشن عام رجسٹریشن فنکشن کی طرح ہی ہے ، ورچوئل فنکشن بھی ایسا ہی ہے ، کوئی خاص نحو نہیں ہے۔ لوا برج میں ، کانسٹ کی نشاندہی کرنے کے طریقہ کار کی کال کے دوران شناخت کی جاسکتی ہے ، تاکہ اگر کوئی فنکشن کانسٹ آبجیکٹ آبجیکٹ یا کسی پوائنٹ کا اعداد و شمار لووا اسکرپٹ کو واپس کرتا ہے تو ، لوا میں اس حوالہ دار شے کو کانسٹ سمجھا جاتا ہے جس سے وہ صرف کال کرسکتا ہے۔ طریقوں. ہر طبقے کے لئے ، تباہ کن خود بخود رجسٹر ہوجاتا ہے۔ ماخذ کلاس میں بیس کلاس میں دوبارہ رجسٹر کرنے کا طریقہ درکار نہیں ہے۔ اگر کسی کلاس میں بیس کلاس ہے جو ** نہیں ** رجوا کے ساتھ ہے ، تو اسے سب کلاس کے طور پر اعلان کرنے کی ضرورت نہیں ہے۔
تعمیر کار
لیوہ میں آبجیکٹ کلاس بنانے کے ل to ، کلاس کو کنسٹرکٹر ایڈ کنسٹرکٹر کے ذریعہ رجسٹرڈ تبدیل کرنا ہوگا۔ اور LUABridge پیرامیٹرز کی تعداد اور قسم خود بخود کنسٹرکٹر کا پتہ نہیں لگاتے (جو کسی فنکشن یا طریقہ کار سے رجسٹرڈ ہوتا ہے جس کا خود بخود پتہ لگاسکتا ہے) مختلف ہوتا ہے ، اور لہذا کنسٹرکٹر رجسٹریشن میں استعمال ہونے پر LUABridge کو ضرور بتانا چاہئے۔
 getGlobalNamespace (L) .beginNamespace ('test') .addFunction ('foo', foo) .addFunction ('bar', bar) .endNamespace ()
Lua میں ، آپ کسی طرح سے A اور B کی مثال تشکیل دے سکتے ہیں۔
|_+_|
lua_tate *
کبھی کبھی بائنڈنگ فنکشن یا ممبر فنکشن ، آپ کو اسٹیم تک رسائی کے ل l پیرامیٹر کے طور پر lua_State * کی ضرورت ہوتی ہے۔ لیو برج کا استعمال کریں ، فنکشن میں ابھی آخری بار lua_State * ٹائپ پیرامیٹر کا پابند ہونا ہے۔ مثال کے طور پر:
 getGlobalNamespace (L)  .beginNamespace ('test') .addVariable ('var1', &globalVar) .addVariable ('var2', &staticVar, false) // read-only .addProperty ('prop1', getString, setString) .addProperty ('prop2', getString) // read only .addFunction ('foo', foo) .addFunction ('bar', bar) .addCFunction ('cfunc', cFunc)  .endNamespace () 
Lua میں ، مندرجہ ذیل کے طور پر استعمال کیا جاسکتا ہے:
|_+_|
اسکرپٹ میں ، ابھی صرف دو پیرامیٹرز پاس ہوئے۔ نوٹ کریں lua_State * ٹائم پیرامیٹر کو فنکشن کی آخر تک تعریف میں ، بصورت دیگر اس کا نتیجہ وضاحتی نہیں ہے۔
کلاس آبجیکٹ کی قسمیں
ٹائپ ٹی کی رجسٹریشن ، لوا اسکرپٹ کی فراہمی کے لئے درج ذیل ممکنہ طریقے:
|_+_|
سی ++ لائف ٹائم
C ++ آبجیکٹ کے لئے ، اس کی تخلیق اور C ++ کوڈ کنٹرول کے ذریعہ اس کو حذف کرنے کے لئے ، Lua GC ان اشیاء کو دوبارہ دعوی نہیں کرسکتا ہے۔ جب Lua * lua_State کے ذریعہ آبجیکٹ کا حوالہ دیتے ہیں ، آپ کو یہ یقینی بنانا ہوگا کہ اعتراض کو حذف نہیں کیا گیا ہے ، بصورت دیگر غیر وضاحتی رویے کا باعث بنے گا۔ مثال کے طور پر ، مندرجہ ذیل طریقہ Lua منتقل کیا جا سکتا ہے
سی ++ آبجیکٹ آبجیکٹ:
|_+_|
لوا لائف ٹائم جب Lua قدر کے ذریعہ C ++ آبجیکٹ کو منتقل کیا جاتا ہے ، تو وہ اعتراض Lua زندگی بھر ہوتا ہے۔ جب قیمت پاس ہوجائے گی ، تو اس چیز کو Lua ، Lua میں Userdata کی شکل میں محفوظ کیا جائے گا ، اور جب اعتراض کے بارے میں مزید حوالہ جات برآمد نہیں ہوں گے۔ جب Userdata بازیافت ہوجاتا ہے تو ، اسی سے متعلق اعتراض
تباہ کن کو طلب کیا جائے گا۔ سی ++ میں ایپلی کیشنز کی زندگی بھر ، آپ کو یہ یقینی بنانا ہوگا کہ اعتراض جی سی بازیاب نہیں ہوا ہے ، بصورت دیگر طرز عمل غیر متعین ہے۔ مثال کے طور پر ، مندرجہ ذیل طریقہ کار سے اتپریرک کا لوا لوا لائف ٹائم پاس کیا جاسکتا ہے۔
getGlobalNamespace (L)  .beginNamespace ('test')   .beginClass<A>('A')   .addConstructor <void (*) (void)> ()   .addStaticData ('staticData', &A::staticData)   .addStaticProperty ('staticProperty', &A::getStaticData)   .addStaticFunction ('getStaticProperty', &A::getStaticProperty) //read-only   .addStaticCFunction ('staticCFunc', &A::staticCFunc)   .addData ('data', &A::dataMember)   .addProperty ('prop', &A::getProperty, &A::setProperty)   .addFunction ('func1', &A::func1)   .addFunction ('virtualFunc', &A::virtualFunc)   .addCFunction ('cfunc', &A::cfunc)   .endClass ()   .deriveClass<B, A>('B')   .addConstructor <void (*) (void)> ()   .addData ('data', &B::dataMember2)   .addFunction ('func1', &B::func1)   .addFunction ('func2', &B::func2)   .endClass ()  .endNamespace ()
جب آپ آبجیکٹ تیار کرتے ہیں تو اسے لوا میں رجسٹرڈ کہا جاتا ہے ، جب چیز کا حوالہ نہیں دیا جاتا ہے تو ، جی سی اس شے کو خود بخود بازیافت کردے گی۔ یقینا you ، آپ اس آبجیکٹ ریفرنس کو پیرامیٹر کے طور پر C ++ میں ڈال سکتے ہیں ، لیکن C ++ حوالوں کو اس مقصد کے استعمال کو یقینی بنانے کی ضرورت کے مطابق ،
تبدیل کریں جو جی سی کو بازیاب نہیں کیا گیا ہے۔
اشارے ، حوالہ جات ، اور قیمت کے لحاظ سے پاس
جب پاس سے Lua میں C ++ کوڈ میں پیرامیٹر کے طور پر C ++ آبجیکٹ ہوتا ہے تو ، LuaBridge خودکار تبادلہ جتنا ممکن ہو سکے گا۔ مثال کے طور پر ، درج ذیل C ++ تقریب میں لوا کے ساتھ اندراج کرنا:
|_+_|
پھر لوا میں ، آپ مندرجہ بالا فنکشن کو درج ذیل طریقے سے کال کرسکتے ہیں۔
|_+_|
مذکورہ بالا سارے افعال تک کسی ممبر اور طریقے کے ممبر تک رسائی حاصل کی جاسکتی ہے۔ اور پوائنٹر پاس کرنا اور وراثت کا معمول کا قاعدہ بھی C ++ میں استعمال ہوتا ہے۔ مثال کے طور پر:
struct A { A () } struct B { explicit B (char const* s, int nChars) } getGlobalNamespace (L) .beginNamespace ('test') .beginClass   ('A') .addConstructor <void (*) (void)> () .endClass () .beginClass   ('B') .addConstructor <void (*) (char const*, int)> () .endClass () .endNamespace ()
لوا کال کریں ان:
a = test.A () -- Create a new A. b = test.B ('hello', 5) -- Create a new B. b = test.B () -- Error: expected string in argument 1
جب C ++ پوائنٹر LUA NULL پر منتقل ہوجاتا ہے تو ، LuaBridge خود بخود اس کی بجائے نیل میں تبدیل ہوجاتا ہے۔ اس کے برعکس ، جب ٹرانسمیشن کیل Lua سے C ++ تک نہیں ہوتا ہے ، تو C ++ NULL پوائنٹر کو منتقل کرنے کے مترادف ہوتا ہے۔
ذریعہ:<
http://www.tuicool.com/articles/yuaqIrn >