Code update and Using Lambda function with find_if()

Code Comment(09/03/2021)

  • remove redundant signal routing
void AA::handleMessage(Message* internalMessage)
{
  switch(Message->getMessageType())
  {
    case MessageType::INTERNAL_MESSAGE_A:
    {
      auto InternalMessageA = static_cast<const messages2::InternalMessageA*>(Message);
      for(const auto& item : InternalMessageA->m_items)
      {
        const U32 id = item.itemId;
        LocalbbInstanceBaseImpl* localBBInstance = m_localDispatcherApi->getBB(id);
        if (localBBInstance)
        {
          std::vector<AInfoS> infoList;
          for(U16 i = 0; i < item.noOfAInfos; i++)
          {
            AInfoS aInfo;
            aInfo.m_aId = item.aInfos[i].aId;
            aInfo.m_aPwr = item.aInfos[i].power;
            infoList.emplace_back(aInfo);
          }
          localBBInstance->handleAData(infoList);
        }
        else
        {
          TRACE_ABNORMAL("localBBInstance is not exist");
        }
      }
      break;
    }
    default:
      ;
  }
}

Comment

  • It seems that received internal message has all data needed by BB class. Why not simply pass internal message to localBBInstance via localBBInstance->handleMessage and then extract all needed data there. In my opinion handleAData is redundant

  • all localBBInstances will use the same memory allocated for single message

    • pseudo code
      for(localBBInstance in message->items)
      {​​​​​
          fetch item localBBInstance object using localBBInstanceId
          pass message to given localBBInstance
      }​​​​​
    

​- in this case all bbInstance will receive exactly the same message, an then it can extract info which is related to given bbInstance

  • with find of find_if function.

Lamda function

  • 람다는 람다 함수 또는 이름없는 함수라고 부르며 함수 object
  • 람다를 정의한 곳의 외부 변수를 람다 내부에서 사용하고 싶을때는 캡쳐
  • 외부 변수를 참조 또는 복사로 캡쳐할 수 있음
  • 클래스에서도 람다를 사용할 수 있음

  • find_if
  • 람다

캡쳐기능

  • 람다 함수 외의 변수를 람다 함수에 가져와 사용하는 것을 캡쳐 라고 함
int main()
{
  int n1, n2, n3, n4, n5;
  [&, n1, n2]{} // n3, n4, n5는 참고, n1, n2는 복사
  [=, &n1, &n2]{} // n3, n4, n5는 복사, n1, n2는 참조

  //[&, &n1]{} // ERROR --> n1을 이미 default 참조로 사용
  //[=, n1]{} // ERROR --> n1을 이미 default 복사로 사용
}
  • 클래스에서의 람다 사용
    • 클래스 멤버 내의 람다 식은 해당 클래스에서 friend로 인식하므로 람다식에서 private멤버의 접근도 가능
    • this 를 캡쳐
[this]{} // this capture--> allow access to member data of the class/Instance
  • find_if와 람다함수
    • find_if함수는 세개의 인자를 가지고 있음
    • 세번 째 인자인 Functor (또는 람다) 의 반환 값이 true 인 경우 검색을 중단

Code update

void AA::handleMessage(Message* internalMessage)
{
  switch(Message->getMessageType())
  {
    case MessageType::INTERNAL_MESSAGE_A:
    {
      auto InternalMessageA = static_cast<const messages2::InternalMessageA*>(Message);
      for(const auto& item : InternalMessageA->m_items)
      {
        const U32 id = item.itemId;
        LocalbbInstanceBaseImpl* localBBInstance = m_localDispatcherApi->getBB(id);
        if (localBBInstance)
        {
          std::vector<AInfoS> infoList;
          for(U16 i = 0; i < item.noOfAInfos; i++)
          {
            AInfoS aInfo;
            aInfo.m_aId = item.aInfos[i].aId;
            aInfo.m_aPwr = item.aInfos[i].power;
            infoList.emplace_back(aInfo);
          }
          localBBInstance->handleMessage(Message);
        }
        else
        {
          TRACE_ABNORMAL("localBBInstance is not exist");
        }
      }
      break;
    }
    default:
      ;
  }
}

void LocalbbInstanceBaseImpl::handleMessage(const Message* message)
{
  case MessageType::_PIM_MITIGATION_MEAS_DATA_IND:
  {
    if(m_bbInstanceData->m_localbbInstanceState == LocalbbInstanceStateE::ACTIVATED)
    {
      m_bbInstanceData->m_measuredAInfo.clear();

      auto InternalMessageA = static_cast<const messages2::InternalMessageA*>(message);
      auto aInfo = std::find_if(InternalMessageA->m_items.begin(),
                                InternalMessageA->m_items.end(),
                                [this](ItemS item){
        return item.itemId == this->m_bbInstanceData->m_bbInstanceId;
      });
      for(U16 i = 0; i < aInfo->noOfAInfos; i++)
      {
        m_bbInstanceData->m_measuredAInfo.emplace_back(AInfoS{aInfo->aInfos[i].aId,
                                                              aInfo->aInfos[i].power});
      }
    }
    break;
  }
}