예제 #1
0
파일: ListaEnc.hpp 프로젝트: caiopo/INE5408
	/**
	 * @brief      Retira o dado na posição pos e o retorna
	 *
	 * @param[in]  pos   Posição para retirar
	 *
	 * @return     O dado retirado
	 */
	T retiraDaPosicao(int pos) {
		if(pos >= size || pos < 0)
			throw std::runtime_error("posicao must be smaller than "
									"ultimo+1 and greater than zero");

		if (listaVazia())
			throw std::runtime_error("lista vazia");


		if (pos == 0)
			return retiraDoInicio();

		if (pos == size)
			return retira();

		auto e = head;

		for (int i = 0; i < pos-1; ++i)
			e = e->getProximo();

		T dado = e->getProximo()->getInfo();

		e->setProximo(e->getProximo()->getProximo());

		--size;

		return dado;
	}
예제 #2
0
파일: ListaEnc.hpp 프로젝트: caiopo/INE5408
	/**
	 * @brief      Retorna o ponteiro para o dado armazenado na lista
	 *
	 * @param[in]  dado  Dado para procurar
	 *
	 * @return     Ponteiro para o dado armazenado na lista
	 */
	T* posicaoMem(const T& dado) const {
		if (listaVazia())
			throw std::runtime_error("lista vazia");

		for (auto e = head; e->getProximo() != nullptr; e = e->getProximo())
			if (e->getInfo() == dado)
				return &e->getInfo();
	}
예제 #3
0
파일: ListaEnc.hpp 프로젝트: caiopo/INE5408
	/**
	 * @brief      Adiciona o dado no final da lista
	 *
	 * @param[in]  dado   Dado a ser adicionado
	 */
	void adiciona(const T& dado) {
		if (listaVazia())
			return adicionaNoInicio(dado);

		auto e = head;

		for (; e->getProximo(); e = e->getProximo()) {}

		e->setProximo(std::make_shared<Elemento<T>>(dado, nullptr));

		++size;
	}
예제 #4
0
	/**
	 * @brief      Adiciona o dado no final da listta
	 *
	 * @param[in]  dado  Daso a ser adicionado
	 */
	void adiciona(const T& dado) {
		auto novo = std::make_shared<Elemento<T>>(dado);
		if (listaVazia()) {
			head = novo;
		} else {
			auto current = head;
			while (current->getProximo()) {
				current = current->getProximo();
			}
			current->setProximo(novo);
		}
		++size;
	}
예제 #5
0
	/**
	 * @brief      Retira o dado que está no final da lista
	 *
	 * @return     Dado que foi removido
	 */
	T retira() {
		if (listaVazia()) throw 20;
		auto current = head;
		auto old = current;
		while (current->getProximo()) {
			old = current;
			current = current->getProximo();
		}
		T retorno = current->getInfo();
		old->setProximo(nullptr);
		--size;
		return retorno;
	}
예제 #6
0
	/**
	 * @brief      Verifica se a lista comtem do dado
	 *
	 * @param[in]  dado  Dado a ser comparado
	 *
	 * @return     Se o dado esta presente na lista
	 */
	bool contem(const T& dado) const {
		auto current = head;
		while (current) {
			if (current->getInfo() == dado) return true;
			current = current->getProximo();
		}
		return false;
	}
예제 #7
0
	/**
	 * @brief      Retira dado de uma posição espesifica
	 *
	 * @param[in]  pos	Posição do dado que vai ser removido
	 *
	 * @return     Dado que foi removido
	 */
	T retiraDaPosicao(int pos) {
		++pos;
		if (listaVazia()) throw 20;
		if (pos < 0 || pos > size) throw 20;
		if (pos == 0) return retiraDoInicio();
		if (pos == size) return retira();
		auto current = head;
		auto old = current;
		while (--pos) {
			old = current;
			current = current->getProximo();
		}
		T retorno = current->getInfo();
		old->setProximo(current->getProximo());
		--size;
		return retorno;
	}
예제 #8
0
	/**
	 * @brief      Remove dado espesifico da lista
	 *
	 * @param[in]  dado	 Dado que vai ser removido
	 *
	 * @return     Dado que removido
	 */
	T retiraEspecifico(const T& dado) {
		if (listaVazia()) throw 20;
		auto current = head;
		auto old = current;
		int i = 1;
		while (current->getProximo()) {
			if (current->getInfo() == dado) break;
			old = current;
			current = current->getProximo();
			++i;
		}
		if (i == size && !(current->getProximo())) throw 20;
		T retorno = current->getInfo();
		old->setProximo(current->getProximo());
		--size;
		return retorno;
	}
void Viewport::transformAndClipAllObjs(){
    m_window.updateTransformation();

    auto element = m_world->getFirstObject();
    while(element != nullptr){
        transformAndClipObj(element->getInfo());
        element = element->getProximo();
    }
}
예제 #10
0
void Viewport::drawObjs(cairo_t* cr){
    m_cairo = cr;

    auto element = m_world->getFirstObject();
    while(element != nullptr){
        drawObj(element->getInfo());
        element = element->getProximo();
    }
    drawObj(m_border);
}
예제 #11
0
파일: ListaEnc.hpp 프로젝트: caiopo/INE5408
	/**
	 * @brief      Retira o dado no final da lista e o retorna
	 *
	 * @return     O dado retirado
	 */
	T retira() {
		if (listaVazia())
			throw std::runtime_error("lista vazia");

		if (size == 1)
			return retiraDoInicio();

		auto e = head;

		for (; e->getProximo()->getProximo(); e = e->getProximo()) {}

		// T data = e->getInfo();
		T data = e->getProximo()->getInfo();

		e->setProximo(nullptr);

		--size;

		return data;
	}
예제 #12
0
	/**
	 * @brief      Posição do dado na memoria
	 *
	 * @param[in]  dado	 Dado a ser comparado
	 *
	 * @return     Posição de memoria onde o dado esta alocado
	 */
	T* posicaoMem(const T& dado) const {
		if (listaVazia()) throw 20;
		int i = 0;
		auto current = head;
		while (current) {
			if (current->getInfo() == dado) return &(current->getInfo());
			current = current->getProximo();
			++i;
		}
		throw 20;
	}
예제 #13
0
파일: ListaEnc.hpp 프로젝트: caiopo/INE5408
	/**
	 * @brief      Adiciona o dado na posição
	 *
	 * @param[in]  dado  Dado a ser inserido
	 * @param[in]  pos   Posição para inserir o dado
	 */
	void adicionaNaPosicao(const T& dado, int pos) {
		if(pos > size || pos < 0)
			throw std::runtime_error("posicao must be smaller than "
									"ultimo+1 and greater than zero");

		if (pos == 0)
			return adicionaNoInicio(dado);

		if (pos == size+1)
			return adiciona(dado);

		auto e = head;

		for (int i = 0; i < pos-1; ++i)
			e = e->getProximo();


		e->setProximo(std::make_shared<Elemento<T>>(dado, e->getProximo()));

		++size;
	}
예제 #14
0
	/**
	 * @brief      Adiciona dado em uma posição especifica da lista
	 *
	 * @param[in]  dado  Dado a ser adicionado
	 * @param[in]  pos   Posição onde o dado vai ser adicionado
	 */
	void adicionaNaPosicao(const T& dado, int pos) {
		if (pos < 0 || pos > size) throw 20;
		if (pos == 0) return adicionaNoInicio(dado);
		if (pos == size) return adiciona(dado);
		auto current = head;
		auto old = current;
		while (--pos) {
			old = current;
			current = current->getProximo();
		}
		old->setProximo(std::make_shared<Elemento<T>>(dado, current));
		++size;
	}
예제 #15
0
파일: ListaEnc.hpp 프로젝트: caiopo/INE5408
	/**
	 * @brief      Retorna a menor posição na qual o dado esteja
	 *
	 * @param[in]  dado  Dado a ser procurado
	 *
	 * @return     Menor índice do dado na lista
	 */
	int posicao(const T& dado) const {
		if (listaVazia())
			throw std::runtime_error("lista vazia");

		auto e = head;

		for (int i = 0; i < size; ++i) {
			if (e->getInfo() == dado)
				return i;
			e = e->getProximo();
		}

		throw std::runtime_error("dado não encontrado");
	}
예제 #16
0
	/**
	 * @brief      Adiciona dado de forma que a lista fique ordenada
	 *
	 * @param[in]  dado  Dado a ser adicionado
	 */
	void adicionaEmOrdem(const T& dado) {
		if (listaVazia()) return adicionaNoInicio(dado);
		auto current = head;
		auto old = current;
		int i = 0;
		while (current) {
			if (current->getInfo() > dado) break;
			old = current;
			current = current->getProximo();
			++i;
		}
		if (!i) return adicionaNoInicio(dado);
		if (i == size) return adiciona(dado);
		old->setProximo(std::make_shared<Elemento<T>>(dado, current));
		++size;
	}