/** * @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; }
/** * @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(); }
/** * @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; }
/** * @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; }
/** * @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; }
/** * @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; }
/** * @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; }
/** * @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(); } }
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); }
/** * @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; }
/** * @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; }
/** * @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; }
/** * @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; }
/** * @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"); }
/** * @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; }