Skip to content

Commit

Permalink
added 5 parameters signals
Browse files Browse the repository at this point in the history
  • Loading branch information
meeloo committed Jul 28, 2013
1 parent 744a938 commit 0d9691a
Showing 1 changed file with 104 additions and 2 deletions.
106 changes: 104 additions & 2 deletions include/nuiSignalsSlots.h
Original file line number Diff line number Diff line change
Expand Up @@ -451,8 +451,8 @@ class nuiSignal4 : public nuiSignal, nuiNonCopyable
for(uint i = 0; it != end; ++it, i++)
tmp[i] = (*it).first;

for(uint i = 0; i < tmp.size(); i++)
tmp[i](param1, param2, param3, param4);
for(uint i = 0; i < tmp.size(); i++)
tmp[i](param1, param2, param3, param4);
}

bool IsConnected ()
Expand Down Expand Up @@ -507,6 +507,96 @@ class nuiSignal4 : public nuiSignal, nuiNonCopyable
};


// N=5
template<class Param1, class Param2, class Param3, class Param4, class Param5, class RetType=detail::DefaultVoid>
class nuiSignal5 : public nuiSignal, nuiNonCopyable
{
friend class nuiSlotsSink;
public:
typedef typename detail::DefaultVoidToVoid<RetType>::type DesiredRetType;
typedef nuiFastDelegate5<Param1, Param2, Param3, Param4, Param5, DesiredRetType> Slot;

nuiSignal5()
{
}

~nuiSignal5()
{
typename std::vector< std::pair<Slot, nuiSlotsSink*> >::const_iterator it = mSlots.begin();
typename std::vector< std::pair<Slot, nuiSlotsSink*> >::const_iterator end = mSlots.end();
for(; it != end; ++it)
{
RemoveConnection(*(*it).second, (*it).first.GetMemento());
}
}

void operator()(Param1 param1, Param2 param2, Param3 param3, Param4 param4, Param4 param5) const
{
if (mDisabled)
return;

//#FIXME: temp hack to avoid modification of the map (connection/deconnection of slots) during iteration
typename std::vector< std::pair<Slot, nuiSlotsSink*> >::const_iterator it = mSlots.begin();
typename std::vector< std::pair<Slot, nuiSlotsSink*> >::const_iterator end = mSlots.end();
std::vector<Slot> tmp(mSlots.size());
for(uint i = 0; it != end; ++it, i++)
tmp[i] = (*it).first;

for(uint i = 0; i < tmp.size(); i++)
tmp[i](param1, param2, param3, param4, param5);
}

bool IsConnected ()
{
return (!mSlots.empty());
}

private:
void Connect(nuiSlotsSink &sink, const Slot &slot)
{
mSlots.push_back(std::make_pair(slot, &sink));
AddConnection(sink, slot.GetMemento());
UpdateStats(mSlots.size());
}

void Disconnect(nuiSlotsSink &sink, const Slot &slot)
{
RemoveConnection(sink, slot.GetMemento());
typename std::vector< std::pair<Slot, nuiSlotsSink*> >::iterator it = mSlots.begin();
typename std::vector< std::pair<Slot, nuiSlotsSink*> >::iterator end = mSlots.end();
while (it != end)
{
if ((*it).first == slot)
{
mSlots.erase(it);
break;
}
++it;
}
}

virtual void DisconnectInternal(const nuiDelegateMemento &slot_)
{
Slot slot;
slot.SetMemento(slot_);
typename std::vector< std::pair<Slot, nuiSlotsSink*> >::iterator it = mSlots.begin();
typename std::vector< std::pair<Slot, nuiSlotsSink*> >::iterator end = mSlots.end();
while (it != end)
{
const Slot& rS(it->first);
if (rS == slot)
{
mSlots.erase(it);
break;
}
++it;
}
}

private:
std::vector< std::pair<Slot, nuiSlotsSink*> > mSlots;
};

class nuiSlotsSink
{
friend class nuiSignal;
Expand Down Expand Up @@ -576,6 +666,18 @@ class nuiSlotsSink
signal.Disconnect(*this, slot);
}

// N=5
template<class Param1, class Param2, class Param3, class Param4, class Param5, class RetType>
void Connect(nuiSignal5<Param1, Param2, Param3, Param4, Param5, RetType> &signal, const typename nuiSignal5<Param1, Param2, Param3, Param4, Param5, RetType>::Slot &slot)
{
signal.Connect(*this, slot);
}
template<class Param1, class Param2, class Param3, class Param4, class Param5, class RetType>
void Disconnect(nuiSignal5<Param1, Param2, Param3, Param4, Param5, RetType> &signal, const typename nuiSignal5<Param1, Param2, Param3, Param4, Param5, RetType>::Slot &slot)
{
signal.Disconnect(*this, slot);
}

private:
void AddConnection(nuiSignal* pSignal, const nuiDelegateMemento &slot);
void RemoveConnection(nuiSignal* pSignal, const nuiDelegateMemento &slot);
Expand Down

0 comments on commit 0d9691a

Please sign in to comment.