Example #1
0
// nを名前の辞書式順序で正しい位置に挿入し、先頭要素を返す
template<class T> Link<T>* Link<T>::add_ordered(Link* n){
	if(n == nullptr || n->value.key() == "") return this;

	Link* p = this;
	if(p->value.key() > n->value.key()) return p->insert(n);

	do{
		p = p->succ;
		if(p->value.key() > n->value.key()){
			p->insert(n);				
			return this;
		}
	} while(p->succ != nullptr);

	p->add(n);
	return this;
}
Example #2
0
Link* Link::generate()
{
	Link* n = new Link();
	n->value = randint(1, 10);
	n->level = 1;

	Link* p = this;

	if (p->find_total(n) != 0)  // Если есть элемент на уровне ниже, то уже добавляем новый элемент слоем выше него.
	{
		p = p->find_lower(n);
		n->level++;
		if (p->find_total(n) != 0) // Есть уже элемент n->level 2
		{
			p = p->find_lower(n); // p это копия элемента n->level 2
			n->level++; // Если есть - добавляем n на третий элемент, n->level стал 3
		}
		if (make_decision(100 / (n->level - 0.6))) // При решении добавить элемент.
		{
			
			cout << "Decision true on p value: " << n->value << ", level: " << n->level << " #" << cnt << '\n';
			p = p->add(n);
			cnt++;
		}
		else 
		{ 
			cout << "Decision false on p value: " << n->value << " level: " << n->level << '\n';
			return this; 
		}
		p = p->set_neighbours();
		return p;
	}
	if (p->find_total(n) != 0)
	{
		if (p->level + 1 < system_levels) 
		return this;
	}
}
Example #3
0
Link* Link::generate()
{
	Link* n = new Link();
	n->value = randint(1, 10);
	n->level = 1;

	Link* p = this;

	while (p->find_total(n))  // Если есть элемент на уровне ниже, то уже добавляем новый элемент слоем выше него.
	{
		p = p->find_total(n);
		n->level++;
		if (n->level == system_levels && n->level == 1 || n->level > system_levels)
		{
			n->level--; // n->level - 1, потому-что счётчик накручивает 5й элемент автоматом
			cout << "Element already exists;" << setw(4) << " value: " << n->value << ", level: " << n->level << " string: " << str_cnt << '\n';
			return this;
		}
	}
	if (make_decision(100 / (n->level - 0.6))) // При решении добавить элемент.
	{

		cout << "Decision true on p " << setw(12) << "value: " << n->value << ", level: " << n->level << " #" << cnt << " string: " << str_cnt << '\n';
		p = p->add(n);
		cnt++;
		str_cnt++;
	}
	else
	{
		cout << "Decision false on p " << setw(11) << "value: " << n->value << ", level: " << n->level << " string: " << str_cnt << '\n';
		str_cnt++;
		return this;
	}
	p = p->set_neighbours();
	return p;
}
Example #4
0
pair<Bridge::shared_ptr, bool> LinkRegistry::declare(const std::string& name,
                                                     Link&        link,
                                                     bool         durable,
                                                     const std::string& src,
                                                     const std::string& dest,
                                                     const std::string& key,
                                                     bool         isQueue,
                                                     bool         isLocal,
                                                     const std::string& tag,
                                                     const std::string& excludes,
                                                     bool         dynamic,
                                                     uint16_t     sync,
                                                     uint32_t     credit,
                                                     Bridge::InitializeCallback init,
                                                     const std::string& queueName,
                                                     const std::string& altExchange
)
{
    Mutex::ScopedLock locker(lock);

    // Durable bridges are only valid on durable links
    if (durable && !link.isDurable()) {
        QPID_LOG(error, "Can't create a durable route '" << name << "' on a non-durable link '" << link.getName());
         return pair<Bridge::shared_ptr, bool>(Bridge::shared_ptr(), false);
    }

    if (dynamic) {
        Exchange::shared_ptr exchange = broker->getExchanges().get(src);
        if (exchange.get() == 0) {
            QPID_LOG(error, "Exchange not found, name='" << src << "'" );
            return pair<Bridge::shared_ptr, bool>(Bridge::shared_ptr(), false);
        }
        if (!exchange->supportsDynamicBinding()) {
            QPID_LOG(error, "Exchange type does not support dynamic routing, name='" << src << "'");
            return pair<Bridge::shared_ptr, bool>(Bridge::shared_ptr(), false);
        }
    }

    BridgeMap::iterator b = bridges.find(name);
    if (b == bridges.end())
    {
        _qmf::ArgsLinkBridge args;
        Bridge::shared_ptr bridge;

        args.i_durable    = durable;
        args.i_src        = src;
        args.i_dest       = dest;
        args.i_key        = key;
        args.i_srcIsQueue = isQueue;
        args.i_srcIsLocal = isLocal;
        args.i_tag        = tag;
        args.i_excludes   = excludes;
        args.i_dynamic    = dynamic;
        args.i_sync       = sync;
        args.i_credit     = credit;

        bridge = Bridge::shared_ptr
          (new Bridge (name, &link, link.nextChannel(),
                       boost::bind(&LinkRegistry::destroyBridge, this, _1),
                       args, init, queueName, altExchange));
        bridges[name] = bridge;
        link.add(bridge);
        if (durable && store && !broker->inRecovery())
            store->create(*bridge);

        QPID_LOG(debug, "Bridge '" << name <<"' declared on link '" << link.getName() <<
                 "' from " << src << " to " << dest << " (" << key << ")");

        return std::pair<Bridge::shared_ptr, bool>(bridge, true);
    }
    return std::pair<Bridge::shared_ptr, bool>(b->second, false);
}