Beispiel #1
0
void CComponentVida::Update(float _fDeltaTime)
{
  if(m_fHoTTime > 0.0f)
  {
    m_fHoTTime -= _fDeltaTime;
    Increase(m_fHoT * _fDeltaTime);
  }else
  {
    m_fHoTTime = 0.0f;
  }

  if(m_fDoTTime > 0.0f)
  {
    m_fDoTTime -= _fDeltaTime;
    Decrease(m_fDoT * _fDeltaTime);
  }else
  {
    m_fDoTTime = 0.0f;
  }

  if(m_bRegen)
  {    
    if(m_fTimeSinceHit <= m_fTimeForRegen)
    {
      m_fTimeSinceHit += _fDeltaTime;
    }else{
      Increase(m_fRegenAmount * _fDeltaTime);
    }
  }
}
Beispiel #2
0
// 用例3:
void CExampleTest::TestCase03()
{
    const char * pMinuend = "8.5";
    const char * pSubtrahend = "7.5";
    char * pResult = NULL;
    Decrease(pMinuend, pSubtrahend, &pResult);
    CPPUNIT_ASSERT(pResult != NULL);
    CPPUNIT_ASSERT(strcmp(pResult, "1") == 0);
    free(pResult);
}
Beispiel #3
0
// 用例4:
void CExampleTest::TestCase04()
{
    const char * pMinuend = "12.34";
    const char * pSubtrahend = "17.24";
    char * pResult = NULL;
    Decrease(pMinuend, pSubtrahend, &pResult);
    CPPUNIT_ASSERT(pResult != NULL);
    CPPUNIT_ASSERT(strcmp(pResult, "-4.9") == 0);
    free(pResult);
}
Beispiel #4
0
void partitionDecreasing(int value)
{
  printf("partitionDecreasing %d\n", value);
  int * arr = malloc(value * sizeof(int));
  int ind = 0;
  Decrease(value,arr,ind);
  free(arr);
  

}
Beispiel #5
0
int CSem::Dec(int nSemIdx, bool bNoWait, bool bUndo, int val)
{
    
    if(m_nBCounterNum > 0)
    {
        return CounterDec(nSemIdx);
    }
    else
    {
        return Decrease(nSemIdx, bNoWait, bUndo, val);
    }
}
Beispiel #6
0
void Decrease(int n,int * arr,int ind)
{
  int val;
if(n == 0)
  {
  partprint(arr,ind);
  return;
  }

for(val=1;val<=n;val++)
  {
   arr[ind]=val;
   if (ind > 0 &&arr[ind-1]>arr[ind])
      {
    Decrease(n-val,arr,ind+1);
      }
if(ind ==0)
{
Decrease(n-val,arr,ind+1);
}
  }
}
Beispiel #7
0
int CSem::CreateCounter(int nKey, int nCounterNum)
{
    if ( nCounterNum > MAX_BIGCOUNTER_NUM || nCounterNum < 1 )
    {
        snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d", __func__, SEM_ERR_CREATECOUNTER_PARA);
        return SEM_ERR_CREATECOUNTER_PARA;
    }
    int nCnt = nCounterNum * 2 + 1;
    int nSemID = semget ( nKey,nCnt,IPC_CREAT|0666 );
    if (nSemID == -1)
    {
        snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d,%s", __func__, SEM_ERR_CREATECOUNTER_SEMGET, strerror(errno));
        return SEM_ERR_CREATECOUNTER_SEMGET;
    }

    m_nKey = nKey;
    m_nSemID = nSemID;
    m_nSemCnt = nCnt;
    m_nBCounterNum = nCounterNum;
    m_nMaxVal = SEM_VALUE_MAX * SEM_VALUE_MAX;

    //初始化信号量
    union semun sem;
    sem.val = 0; 
    sem.array = new ushort [nCnt];
    for ( int i = 0; i < nCnt; i++ )
    {
        sem.array[i] = 0;
    }
    sem.array[m_nSemCnt - 1] = m_nBCounterNum; //最后一个用于记录BigCounter个数
    
    int nRet = semctl (m_nSemID, nCnt, SETALL, sem);
    delete [] sem.array;
    if ( nRet < 0 )
    {
        
        snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d,%s", __func__, SEM_ERR_CREATECOUNTER_SEMCTL, strerror(errno));
        return SEM_ERR_CREATECOUNTER_SEMCTL;
    }
    
    nRet = Increase(0, true, true);
    if(nRet < 0)
        return nRet;
    
    nRet = Decrease(0, true, true);
    if(nRet < 0)
        return nRet;
    
    return m_nSemID;
}
Beispiel #8
0
void CComponentVida::ReceiveEvent(const SEvent& _Event)
{
  if(_Event.Msg == SEvent::REBRE_IMPACTE)
  {
    assert(_Event.Info[0].Type == SEventInfo::FLOAT);

    if(m_fVida > 0.f)
    {
      float l_fDamage = _Event.Info[0].f;

      //Si té escut, el mal el rep aquest.
      //La resta del mal passa al jugador per si l'escut es trenca.
      if(m_pShield)
        l_fDamage = m_pShield->Decrease(l_fDamage);

      Decrease(l_fDamage);
    }
      else return;

  }else /*if(_Event.Msg == SEvent::REBRE_FORCE)
  {
    if(m_fVida > 0.f)
    {
      float l_fDamage = _Event.Info[0].f;

      Decrease(l_fDamage);

      if(m_fVida <= 0.f)
      {
        SEvent l_morir;
        l_morir.Msg = SEvent::MORIR;
        l_morir.Receiver = l_morir.Sender = GetEntity()->GetGUID();
      
        CORE->GetEntityManager()->SendEvent(l_morir);
      }
    }

  }else*/ if(_Event.Msg == SEvent::MORIR)
  {
    m_fVida = 0.0f;
    m_bRegen = false;
  }
}
Beispiel #9
0
void TimeTextCtrl::OnMouse(wxMouseEvent &event)
{
   if (event.LeftDown() && event.GetX() >= mWidth) {
      wxContextMenuEvent e;
      OnContext(e);
   }
   else if (event.LeftDown()) {
      SetFocus();

      int bestDist = 9999;
      unsigned int i;

      mFocusedDigit = 0;
      for(i=0; i<mDigits.GetCount(); i++) {
         int dist = abs(event.m_x - (mDigits[i].digitBox.x +
                                     mDigits[i].digitBox.width/2));
         if (dist < bestDist) {
            mFocusedDigit = i;
            bestDist = dist;
         }
      }

      Refresh(false);
   }
   else if (event.RightDown() && mMenuEnabled) {
      wxContextMenuEvent e;
      OnContext(e);
   }
   else if( event.m_wheelRotation != 0 ) {
      int steps =  event.m_wheelRotation /
         (event.m_wheelDelta > 0 ? event.m_wheelDelta : 120);

      if (steps < 0) {
         Decrease(-steps);
         Updated();
      }
      else {
         Increase(steps);
         Updated();
      }
   }
}
/**
Called by ServiceL()

It tests the function code and then delegates to
the appropriate function.
*/
void CCountServSession::DispatchMessageL(const RMessage2& aMessage)
	{
	switch (aMessage.Function())
        {
	case ECountServSetFromString:
		SetFromStringL(aMessage);
		return;
	case ECountServIncrease:
		Increase();
		return;
	case ECountServIncreaseBy:
		IncreaseBy(aMessage);
		return;
	case ECountServDecrease:
		Decrease();
		return;
	case ECountServDecreaseBy:
		DecreaseBy(aMessage);
		return;
	case ECountServReset:
		Reset();
		return;
	case ECountServValue:
		CounterValueL(aMessage);
		return;
	  
	  // This is an example of a request that we know about, but don't support.
	  // We cause KErrNotSupported to be returned to the client.
	case ECountServUnsupportedRequest:
		User::Leave(KErrNotSupported);
		
	 //  Requests that we don't understand at all are a different matter.
	 //  This is considered a client programming error, so we panic the 
	 //  client - this also completes the message.
	default:
		PanicClient(aMessage,EBadRequest);
		return;
        }
	}
Beispiel #11
0
void LWSlider::OnMouseEvent(wxMouseEvent & event)
{
   if (event.Entering()) {
      #if wxUSE_TOOLTIPS // Not available in wxX11
      // Display the tooltip in the status bar
      if (mParent->GetToolTip()) 
      {
         wxString tip = mParent->GetToolTip()->GetTip();
         GetActiveProject()->TP_DisplayStatusMessage(tip);
         Refresh();
      }
      #endif
   }
   else if (event.Leaving())
   {
      GetActiveProject()->TP_DisplayStatusMessage(wxT(""));
      Refresh();
   }

   // Events other than mouse-overs are ignored when we are disabled
   if (!mEnabled)
      return;

   float prevValue = mCurrentValue;

   // Figure out the thumb position
   wxRect r;
   if (mOrientation == wxHORIZONTAL)
   {
      r.x = mLeft + ValueToPosition(mCurrentValue);
      r.y = mTop + (mCenterY - (mThumbHeight / 2));
   }
   else 
   {
      r.x = mLeft + (mCenterX - (mThumbWidth / 2));
      r.y = mTop + ValueToPosition(mCurrentValue);
   }
   r.width = mThumbWidth;
   r.height = mThumbHeight;

   wxRect tolerantThumbRect = r;
   tolerantThumbRect.Inflate(3, 3);

   // Should probably use a right click instead/also
   if( event.ButtonDClick() && mPopup )
   {
      //On a double-click, we should pop up a dialog.
      DoShowDialog(mParent->ClientToScreen(wxPoint(event.m_x,event.m_y)));
   }
   else if( event.ButtonDown() )
   {
      if( mDefaultShortcut && event.CmdDown() )
      {
         mCurrentValue = mDefaultValue;
      }

      if( event.RightDown() ) {
         mParent->SetFocus();
      }

      // Thumb clicked?
      //
      // Do not change position until first drag.  This helps
      // with unintended value changes.
      if( tolerantThumbRect.Contains( event.GetPosition() ) )
      {
         // Remember mouse position and current value
         mClickPos = (mOrientation == wxHORIZONTAL) ? event.m_x : event.m_y;
         mClickValue = mCurrentValue;

         mIsDragging = true;
      }
      // Clicked to set location?
      else
      {
         mCurrentValue = 
            ClickPositionToValue(
               (mOrientation == wxHORIZONTAL) ? event.m_x : event.m_y, 
               event.ShiftDown());
      }

      mParent->CaptureMouse();
      // wxSetCursor(wxCURSOR_BLANK);
      ((TipPanel*)LWSlider::sharedTipPanel)->SetTargetParent(mParent);
      FormatPopWin();
      SetPopWinPosition();
      LWSlider::sharedTipPanel->Show();
      //hide mouseover tooltip
      wxToolTip::Enable(false);
   }
   else if( event.ButtonUp() )
   {
      mIsDragging = false;
      if (mParent->HasCapture())
         mParent->ReleaseMouse();
      LWSlider::sharedTipPanel->Hide();
      //restore normal tooltip behavor for mouseovers
      wxToolTip::Enable(true);
      // wxSetCursor(wxNullCursor);
   }
   else if (event.Dragging() && mIsDragging)
   {
      if (mOrientation == wxHORIZONTAL)
      {
         if (event.m_y < (r.y - 2 * r.height) ||
             event.m_y > (r.y + 3 * r.height)) {
            // If the mouse y coordinate is relatively far from the slider,
            // snap back to the original position
            mCurrentValue = mClickValue;
         }
         else {
            // Otherwise, move the slider to the right position based
            // on the mouse position
            mCurrentValue = DragPositionToValue(event.m_x, event.ShiftDown());
         }
      }
      else // (mOrientation == wxVERTICAL)
      {
         if (event.m_x < (r.x - 2 * r.width) ||
             event.m_x > (r.x + 3 * r.width)) {
            // If the mouse x coordinate is relatively far from the slider,
            // snap back to the original position
            mCurrentValue = mClickValue;
         }
         else {
            // Otherwise, move the slider to the right position based
            // on the mouse position
            mCurrentValue = DragPositionToValue(event.m_y, event.ShiftDown());
         }
      }
   }
   else if( event.m_wheelRotation != 0 )
   {
      //Calculate the number of steps in a given direction this event
      //represents (allows for two or more clicks on a single event.)
      double steps =  event.m_wheelRotation /
         (event.m_wheelDelta > 0 ? (double)event.m_wheelDelta : 120.0);

      if( steps < 0.0 )
      {
         Decrease( (float)-steps );
      }
      else
      {
         Increase( (float)steps );
      }
      SendUpdate( mCurrentValue );
   }

   if( prevValue != mCurrentValue )
      SendUpdate( mCurrentValue );
}
Beispiel #12
0
void LWSlider::OnKeyEvent(wxKeyEvent & event)
{
   if (mEnabled)
   {
      switch( event.GetKeyCode() )
      {
         case WXK_RIGHT:
         case WXK_UP:
            Increase( mScrollLine );
            SendUpdate( mCurrentValue );
            break;

         case WXK_LEFT:
         case WXK_DOWN:
            Decrease( mScrollLine );
            SendUpdate( mCurrentValue );
            break;

         case WXK_PAGEUP:
#if !wxCHECK_VERSION(2,7,0)
         case WXK_PRIOR:
#endif
            Increase( mScrollPage );
            SendUpdate( mCurrentValue );
            break;

         case WXK_PAGEDOWN:
#if !wxCHECK_VERSION(2,7,0)
         case WXK_NEXT:
#endif
            Decrease( mScrollPage );
            SendUpdate( mCurrentValue );
            break;

         case WXK_HOME:
            SendUpdate( mMinValue );
            break;

         case WXK_END:
            SendUpdate( mMaxValue );
            break;

         case WXK_TAB:
            {
               wxNavigationKeyEvent nevent;
               nevent.SetWindowChange( event.ControlDown() );
               nevent.SetDirection( !event.ShiftDown() );
               nevent.SetEventObject( mParent );
               nevent.SetCurrentFocus( mParent );
               mParent->GetParent()->ProcessEvent( nevent );
            }
            break;

         case WXK_RETURN:
         case WXK_NUMPAD_ENTER:
            {
               wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(mParent), wxTopLevelWindow);
               wxWindow *def = tlw->GetDefaultItem();
               if (def && def->IsEnabled()) {
                  wxCommandEvent cevent(wxEVT_COMMAND_BUTTON_CLICKED,
                        def->GetId());
                  mParent->ProcessEvent(cevent);
               }
            }

         default:
            // Allow it to propagate
            event.Skip();
            break;
      }
   }

   event.Skip();
}
Beispiel #13
0
//   [ Sem1 Sem2 ]  = SmallCounter
//   两个信号量为1个SmallCounter,组成1个小计数器,第一个信号量用作开关,第二个用于计数
//
//   [Group1]...[GroupN] = BigCounter  
//   多个SmallCounter组成1个大计数器
//
//   [BigCounter1] ... [BigCounterN] = Semaphores
//   信号量集根据大计数器的个数,为每个大计数器平均分配SmallCounter数量
//
//   每个BigCounter的最大计数值 = SmallCounter数量 * SEM_VALUE_MAX
int CSem::CreateCounter(int nKey, int nCounterNum)
{
    if ( nCounterNum > MAX_BIGCOUNTER_NUM || nCounterNum < 1 )
    {
        snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d", __func__, SEM_ERR_CREATECOUNTER_PARA);
        return SEM_ERR_CREATECOUNTER_PARA;
    }
    int nCnt = 65535;
    int nSemID = semget ( nKey,nCnt,IPC_CREAT|0666 );
    if (nSemID == -1)
    {
        
        snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d,%s", __func__, SEM_ERR_CREATECOUNTER_SEMGET, strerror(errno));
        return SEM_ERR_CREATECOUNTER_SEMGET;
    }

    m_nKey = nKey;
    m_nSemID = nSemID;
    m_nSemCnt = nCnt;
    m_nBCounterNum = nCounterNum;
    int res = 0;
    if(m_nBCounterNum % 2 == 0)
    {
        res = 0;//剩下的是单数
    }
    else
        res = 1;//剩下的是双数
    
    m_nSCounterNum  = ((m_nSemCnt - res - m_nBCounterNum - 1) / m_nBCounterNum) / 2 ;
    m_nMaxVal = m_nSCounterNum * SEM_VALUE_MAX;

    //初始化信号量
    union semun sem;
    sem.val = 0; 
    sem.array = new ushort [nCnt];
    for ( int i = 0; i < m_nSCounterNum * 2 * m_nBCounterNum; i++ )
    {
        if(i % (m_nSCounterNum * 2) == 0)                  //第一个开关打开
        {
            sem.array[i] = 0;
            continue;
        }
        if(i % 2 == 0)                  //其余开关关闭
        {
            sem.array[i] = 1;
        }
        else                            //计数器清0
            sem.array[i] = 0;
    }
    
    for ( int i = m_nSCounterNum * 2 * m_nBCounterNum; i < m_nSCounterNum * 2 * m_nBCounterNum + m_nBCounterNum; i++ )//SmallCounter记录清0
    {
        sem.array[i] = 0;
    }
    
    for ( int i = m_nSCounterNum * 2 * m_nBCounterNum + m_nBCounterNum; i < m_nSemCnt - 1; i++ )//用于锁
    {
        sem.array[i] = 0;
    }
    
    sem.array[m_nSemCnt - 1] = m_nBCounterNum; //最后一个用于记录BigCounter个数
    
    int nRet = semctl (m_nSemID, nCnt, SETALL, sem);
    delete [] sem.array;
    if ( nRet < 0 )
    {
        
        snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d,%s", __func__, SEM_ERR_CREATECOUNTER_SEMCTL, strerror(errno));
        return SEM_ERR_CREATECOUNTER_SEMCTL;
    }
    
    nRet = Increase(0, true, true);
    if(nRet < 0)
        return nRet;
    
    nRet = Decrease(0, true, true);
    if(nRet < 0)
        return nRet;
    
    return m_nSemID;
}
Beispiel #14
0
int CSem::Create(int nKey, int nCnt, int initVal)
{
    assert ( nKey != -1 );
    int nSemID, nRet;
    union semun sem ;   

    if ( nCnt < 1 )
    {
        snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d", __func__, SEM_ERR_CREATE_PARA);
        return SEM_ERR_CREATE_PARA; 
    }
    nSemID = semget ( nKey,nCnt,IPC_CREAT|0666 );
    if (nSemID == -1)
    {
        
        snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d,%s", __func__, SEM_ERR_CREATE_SEMGET, strerror(errno));
        return SEM_ERR_CREATE_SEMGET;
    }

    m_nKey = nKey;
    m_nSemID = nSemID;
    m_nSemCnt = nCnt;

    //初始化信号量
    sem.val = initVal; 
    sem.array = new ushort [nCnt];
    for ( int i = 0; i < nCnt; i++ )
        sem.array[i] = initVal;
    
    nRet = semctl (m_nSemID, nCnt, SETALL, sem);
    delete [] sem.array;

    if ( nRet < 0 )
    {
        
        snprintf(m_errmsg, sizeof(m_errmsg), "%s=%d,%s", __func__, SEM_ERR_CREATE_SEMCTL, strerror(errno));
        return SEM_ERR_CREATE_SEMCTL;
    }
    ///初始化后立即调用,主要是要调用semop函数操作改变arg.buf->sem_otime
    if(initVal == SEM_VALUE_MAX)
    {
        nRet = Decrease(0, true, true);
        if(nRet < 0)
            return nRet;
        
        nRet = Increase(0, true, true);
        if(nRet < 0)
            return nRet;
    }
    else
    {
        nRet = Increase(0, true, true);
        if(nRet < 0)
            return nRet;
        
        nRet = Decrease(0, true, true);
        if(nRet < 0)
            return nRet;
    }

    return m_nSemID;
}
Beispiel #15
0
void TimeTextCtrl::OnKeyDown(wxKeyEvent &event)
{
   event.Skip(false);
   int keyCode = event.GetKeyCode();
   int digit = mFocusedDigit;

   if (mFocusedDigit < 0)
      mFocusedDigit = 0;
   if (mFocusedDigit >= (int)mDigits.GetCount())
      mFocusedDigit = mDigits.GetCount()-1;

   // Convert numeric keypad entries.
   if ((keyCode >= WXK_NUMPAD0) && (keyCode <= WXK_NUMPAD9)) keyCode -= WXK_NUMPAD0 - '0';

   if (keyCode >= '0' && keyCode <= '9') {
      mValueString[mDigits[mFocusedDigit].pos] = wxChar(keyCode);
      ControlsToValue();
      ValueToControls();
      mFocusedDigit = (mFocusedDigit+1)%(mDigits.GetCount());
      Updated();
   }

   else if (keyCode == WXK_BACK) {
      // Moves left, replaces that char with '0', stays there...
      mFocusedDigit--;
      mFocusedDigit += mDigits.GetCount();
      mFocusedDigit %= mDigits.GetCount();
      mValueString[mDigits[mFocusedDigit].pos] = '0';
      ControlsToValue();
      ValueToControls();
      Updated();
   }

   else if (keyCode == WXK_LEFT) {
      mFocusedDigit--;
      mFocusedDigit += mDigits.GetCount();
      mFocusedDigit %= mDigits.GetCount();
      Refresh();
   }

   else if (keyCode == WXK_RIGHT) {
      mFocusedDigit++;
      mFocusedDigit %= mDigits.GetCount();
      Refresh();
   }
   
   else if (keyCode == WXK_HOME) {
      mFocusedDigit = 0;
      Refresh();
   }
   
   else if (keyCode == WXK_END) {
      mFocusedDigit = mDigits.GetCount() - 1;
      Refresh();
   }

   else if (keyCode == WXK_UP) {
      Increase(1);
      Updated();
   }

   else if (keyCode == WXK_DOWN) {
      Decrease(1);
      Updated();
   }

   else if (keyCode == WXK_TAB) {   
      wxWindow *parent = GetParent();
      wxNavigationKeyEvent nevent;
      nevent.SetWindowChange(event.ControlDown());
      nevent.SetDirection(!event.ShiftDown());
      nevent.SetEventObject(parent);
      nevent.SetCurrentFocus(parent);
      GetParent()->ProcessEvent(nevent);
   } 

   else if (keyCode == WXK_RETURN || keyCode == WXK_NUMPAD_ENTER) {
      wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow);
      wxWindow *def = tlw->GetDefaultItem();
      if (def && def->IsEnabled()) {
         wxCommandEvent cevent(wxEVT_COMMAND_BUTTON_CLICKED,
                               def->GetId());
         GetParent()->ProcessEvent(cevent);
      }
   }

   else {
      event.Skip();
      return;
   }

   if (digit != mFocusedDigit) {
      SetFieldFocus(mFocusedDigit);
   }

   event.Skip(false);
}