• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Aucun tag

Frequently used words (click to add to your profile)

javaandroidc++linuxc#objective-ccocoa誰得qtrubypythonwindowsphpgamebathyscapheguic翻訳omegattwitterframeworkbtronvb.net計画中(planning stage)testdomarduinodirectxpreviewerゲームエンジン

Commit MetaInfo

Révision75cc5216b03371b1db665f52cdfbb7e043be4b8c (tree)
l'heure2020-11-22 21:52:42
Auteurdhrname <dhrname@user...>
Commiterdhrname

Message de Log

Add the insertBefore method

Change Summary

Modification

--- a/joestar/cpp/main.cpp
+++ b/joestar/cpp/main.cpp
@@ -147,7 +147,7 @@ inline void BaseNode::throwNULLArgumentError(Node* const node, const std::string
147147 inline void BaseNode::throwArgumentError(Node* const node, const std::string& name)
148148 {
149149 this->throwNULLArgumentError(node, name);
150- if ( node->isNode() )
150+ if ( !node->isNode() )
151151 {
152152 /*バグの放置を防ぐため、例外を投げる前に、エラーを出力して報告*/
153153 std::cerr << "Argument Error on the member " << name << std::endl;
@@ -206,6 +206,12 @@ Node* BaseNode::getLastChild()
206206 {
207207 return this->lastChild;
208208 }
209+
210+/*removeChild メンバ関数
211+ *自分からchildノードを引き離して、子ノードとして扱わないようにさせる
212+ *@param child 引き離される子ノード
213+ *@return 引き離された子ノード
214+ **/
209215 Node* BaseNode::removeChild(Node* const child)
210216 {
211217 this->throwArgumentError(child, "removeChild");
@@ -240,7 +246,69 @@ Node* BaseNode::removeChild(Node* const child)
240246 }
241247 Node* BaseNode::insertBefore(Node* const node, Node* const prev)
242248 {
243- return this->parentNode;
249+ this.throwArgumentError(node, "insertBefore");
250+
251+ /*prevはemptynodeの可能性が含まれる*/
252+ this.throwNULLArgumentError(prev, "insertBefore");
253+
254+ /*祖先ノードの中に、今挿入しつつあるnodeと一致するものがあれば、参照エラー
255+ * というのは、循環参照を引き起こすため*/
256+ Node* p = this;
257+
258+ while (p.isNode())
259+ {
260+ if (p == node)
261+ {
262+ throw std::invalid_argument("Reference error on the insertBefore");
263+ }
264+
265+ p = p->getParent(p);
266+ }
267+
268+ Node* pnode = node->getParent();
269+
270+ if (pnode->isNode())
271+ {
272+ /*nodeがすでに、他の枝に挿入されていた(子ノードであった)場合、引き離しておく*/
273+ pnode->removeChild(node);
274+ }
275+
276+ node->setParent(this);
277+
278+ if (!prev->isNode())
279+ {
280+ /*prevノードがemptynodeの場合、末子ノードとしてnodeが追加される
281+ *末子ノードが存在するときは、そのノードのメンバも書きかえておく*/
282+ Node* lastChild = this->getLastChild();
283+ if (lastChild->isNode())
284+ {
285+ lastChild->setNext(node);
286+ node->setPrev(lastChild);
287+ }
288+ /*末子ノードとして挿入*/
289+ this->setLastChild(node);
290+ }
291+ else
292+ {
293+ Node* prevOfPrev = prev->getPrev();
294+ if (prevOfPrev->isNode())
295+ {
296+ /*prevの隣接ノードのnextSiblingメンバを書きかえておく*/
297+ prevOfPrev->setNext(node);
298+ }
299+ node->setPrev(prevOfPrev);
300+ prev->setPrev(node);
301+ node->setNext(prev);
302+ }
303+
304+ if (this->getFirstChild() == prev)
305+ {
306+ /*長子ノードがprevの場合、firstChildメンバをnodeに書きかえておく
307+ *これはprevがemptynodeの場合でも同様*/
308+ this->setFirstChild(node);
309+ }
310+
311+ return node;
244312 }
245313 Node* BaseNode::appendChild(Node* const node)
246314 {