اقوم بعمل overload للمعاملين operator>> و operator<< للنوع basic_istream و basic_ostream لدعم مكتبة iostream مع فئات مكتبتى StrLib.
عملية اعادة تعريف insertion operator امرها سهل و قد انتهيت منها منذ فتره طويله اما الصعبه فهى استخراج النص من الـ stream بأقل قدر ممكن العمليات و ايضا من استهلاك الذاكره، عموما بعد البحث و الإطلاع على كود مكتبة iostream و string فهمت بعض الأمور.
الفئه istream تستخدم الفئه basic_streambuf كمخزن مؤقت للقيمه المدخله لـ stdin و عندما تتم القراءة من الفئه يتم نسخ محتويات الـ buffer إلى داخل المتغير، بالنسبه للفئه string (او لأكون دقيق basic_string) فإنه عند القراءة فإنه يتم حذف محتويات الفئه بأكملها و يتم اضافة محتويات الـ buffer حرف حرف حتى يتم الإنتهاء من النسخ.
فى حالتى هذه العمليه ستكون مكلفه جدا لإنى سأضطر للنسخ فى متغير char* مؤقت و من ثم انسخ محتوياته داخل المخزن الداخلى لدى و ذلك لأن الـ basic_streambuf لا تدعم الوصول لعناصرها إلا إذا كنت ترثها، لذا فقد فكرت فى النسخ مباشرة من نسخة basic_streambuf المستخدمه من قبل الكائن cin.
فى البدايه سأقوم بإستدعاء الداله
cin.rdbuf()->sgetc()
و ذلك حتى يقوم المستخدم بإدخال النص الذى يريد و الداله نفسها ستعيد لى اول حرف تم ادخاله من المستخدم، الأن المفترض ان اصل بطريقه ما للـ buffer الداخلى و الذى مسبقا انا اعرف مساحته من خلال استدعائى للداله
cin.rdbuf()->in_avail()
المساحه العائده هى عدد الحروف التى تم قرائتها بالإضافة إلى الـ null terminator.
توجد الداله gptr() و هى protected دخل الـ streambuf، عندما رأيت هذه الداله ابشرت لإنى اعتقدت انى قد استطيع ان ارث الفئه basic_streambuf و بعد هذا اضع داخل نسختى ما اريد من دوال و بعدها اقوم بتحديد لـ istream ان نسخة الـ buffer ألأتى تتعامل معها هى نسختى و لكن عند محاولة تطبيق هذه الطريقه ظهرت لى اخطاء عديده و صراحه لقد وصل عقلى لمرحلة الإنغلاق لإنى اعمل عليها من اول اليوم فهل من معين.
و الله ولى التوفيق