KSGSArray.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include "KSGSArray.h"
  2. #include "../Klassen/KSGSTyp.h"
  3. #include "../Error/Error.h"
  4. #include "../Main/KSGScriptObj.h"
  5. #include "../Klassen/KSGSInt.h"
  6. #include "../Klassen/KSGSBool.h"
  7. using namespace KSGScript;
  8. // Inhalt der KSGSArrayKlasse Klasse aus KSGSArray.h
  9. // Konstruktor
  10. KSGSArrayKlasse::KSGSArrayKlasse( KSGScriptObj *zObj, RCArray< KSGSVariable > *std )
  11. : KSGSKlasseInstanz( KSGS_ARRAY, 0, 0, zObj )
  12. {
  13. val = std;
  14. }
  15. // Destruktor
  16. KSGSArrayKlasse::~KSGSArrayKlasse()
  17. {
  18. val->release();
  19. }
  20. // nicht constant
  21. KSGSVariable *KSGSArrayKlasse::startFunktion( int id, bool access, RCArray< KSGSVariable > *parameter )
  22. {
  23. KSGSVariable *ret = 0;
  24. switch( id )
  25. {
  26. case 0: // void anhängen( ... )
  27. if( parameter->getEintragAnzahl() < 1 )
  28. error( 20, {}, obj );
  29. val->add( parameter->get( 0 ) );
  30. break;
  31. case 1: // void einfügen( int, ... )
  32. if( parameter->getEintragAnzahl() < 2 )
  33. error( 20, {}, obj );
  34. if( parameter->z( 0 ) )
  35. val->add( parameter->get( 1 ), parameter->z( 0 )->getInt() );
  36. break;
  37. case 2: // void set( int, ... )
  38. if( parameter->getEintragAnzahl() < 2 )
  39. error( 20, {}, obj );
  40. if( parameter->z( 0 ) )
  41. val->set( parameter->get( 1 ), parameter->z( 0 )->getInt() );
  42. break;
  43. case 3: // void setPosition( int, int )
  44. if( parameter->getEintragAnzahl() < 2 )
  45. error( 20, {}, obj );
  46. if( parameter->z( 0 ) && parameter->z( 1 ) )
  47. val->setPosition( parameter->z( 0 )->getInt(), parameter->z( 1 )->getInt() );
  48. break;
  49. case 4: // void lösche( int )
  50. if( parameter->getEintragAnzahl() < 1 )
  51. error( 20, {}, obj );
  52. if( parameter->z( 0 ) )
  53. val->remove( parameter->z( 0 )->getInt() );
  54. break;
  55. case 5: // void tausche( int, int )
  56. if( parameter->getEintragAnzahl() < 2 )
  57. error( 20, {}, obj );
  58. if( parameter->z( 0 ) && parameter->z( 1 ) )
  59. val->tausch( parameter->z( 0 )->getInt(), parameter->z( 1 )->getInt() );
  60. break;
  61. case 6: // void leeren()
  62. val->leeren();
  63. break;
  64. case 7: // int getEintragAnzahl()
  65. ret = new KSGSIntKlasse( obj, val->getEintragAnzahl() );
  66. break;
  67. case 8: // ... get( int )
  68. if( parameter->getEintragAnzahl() < 1 )
  69. error( 20, {}, obj );
  70. if( parameter->z( 0 ) )
  71. ret = val->get( parameter->z( 0 )->getInt() );
  72. break;
  73. case 9: // bool hat( int )
  74. if( parameter->getEintragAnzahl() < 1 )
  75. error( 20, {}, obj );
  76. if( parameter->z( 0 ) )
  77. ret = new KSGSBoolKlasse( obj, val->z( parameter->z( 0 )->getInt() ) != 0 );
  78. break;
  79. }
  80. parameter->release();
  81. return ret;
  82. }
  83. KSGSVariable *KSGSArrayKlasse::doOperator( int id, KSGSVariable *rechts )
  84. {
  85. if( !rechts )
  86. {
  87. error( 3, {}, obj );
  88. return 0;
  89. }
  90. KSGSVariable *ret = 0;
  91. switch( id )
  92. {
  93. case KSGS_O_SET:
  94. if( 1 )
  95. {
  96. val->release();
  97. val = rechts->getArray();
  98. ret = getThis();
  99. }
  100. break;
  101. }
  102. if( !ret )
  103. error( 21, {}, obj );
  104. rechts->release();
  105. return ret;
  106. }
  107. // constant
  108. RCArray< KSGSVariable > *KSGSArrayKlasse::getVal() const
  109. {
  110. return val->getThis();
  111. }
  112. RCArray< KSGSVariable > *KSGSArrayKlasse::zVal() const
  113. {
  114. return val;
  115. }
  116. // Reference Counting
  117. KSGSVariable *KSGSArrayKlasse::release()
  118. {
  119. ref--;
  120. if( !ref )
  121. delete this;
  122. return 0;
  123. }