二重リンク リストのnatvis ビジュアライザーを作成したいと思います。リストにはカウント ノードが格納されておらず、拡張が停止しないため、簡単な方法はうまく機能しません (next は決して null ではなく、リストの最後の項目はリスト ルートを指しています)。
<Type Name="TListBidir<*>">
<Expand>
<LinkedListItems>
<HeadPointer>next</HeadPointer>
<NextPointer>next</NextPointer>
<ValueNode>($T1 *)this</ValueNode>
</LinkedListItems>
</Expand>
</Type>
リスト ヘッドと比較する NextPointer に Condition 属性を追加できることを期待しましたが、NextPoint はノードのコンテキストで評価されるため、何と比較すればよいかわかりません。
<NextPointer Condition="next!=XXXXXXXXX">next</NextPointer>
これは、 #list がこれを自動的に処理していたため、skip ディレクティブを使用して、以前 (2010 年) のビジュアライザーでどのように見えたかを示しています。
#list
無限のトラバーサルから保護され、循環リストに適切に対処します。また、skip:
式を使用して、報告されるべきではないセンチネル ノードを示すこともできます。名前はノードがスキップされることを暗示していますが、実際にはトラバーサルが停止するため、センチネル ノードが最初にある場合は、その後にトラバーサルを開始する必要があります。
TListBidir<*,*,*>{
children
(
#list(
head: ((($T2 *)&$c)->next),
next: next,
skip : &($c)
): (($T1 *)(&$e))
)
}
ルート要素に再び到達したら、リストの展開を停止する必要があるデバッガーに natvis で説明するにはどうすればよいですか?