2013-12-08 67 views
0

我正在嘗試實現buildPath的高性能(最小堆活動)和@safepure的變體。高性能安全路徑和純路徑構建

我到目前爲止嘗試是

/** Returns: Path to $(D this) File. */ 
string path() @property @safe const pure { 
    const Dir[] parents; 
    // collect parenting Dirs 
    auto currParent = parent; 
    size_t pathLength = 0; // returned path length 
    while (currParent !is null) { 
     if (currParent !is parent) { 
      pathLength += 1; 
     } 
     pathLength += currParent.name.length; 
     parents ~= currParent; 
     currParent = parent.parent; 
    } 

    // build path 
    auto path_ = new char[pathLength]; 
    size_t i = 0; 
    foreach (currParent_; parents) { 
     const parentName = currParent_.name; 
     if (i != 0) { 
      path_[++i] = '/'; 
     } 
     path_[i .. parentName.length] = parentName[]; 
     i += parentName.length; 
    } 
    return path; 
} 

不過,這並不因爲對parentscurrParent與常量性問題的編譯。

/home/per/Work/justd/fs.d(408): Error: cannot modify const expression parents 
/home/per/Work/justd/fs.d(409): Error: cannot modify const expression currParent 

如果我讓path()@trusted和非const代替@safe constparents非const的代碼編譯這是可以接受的,但絕對不是漂亮。

是否有可能申報const class Dir -references(parents)和 一個可變基準的可變數組const對象(pathSlow)?如果這樣可以以優雅的方式解決這個問題。

請注意,path()是文件系統樹結構的成員函數,其中每個節點包含對類Dir的實例的引用。

回答

1

聽起來像是你要使用

const(Dir)[] parents; 

如果Dir是一個類,它不會讓你做一個const的參考,可以重新分配(我認爲這是爲了在某個時候被改變,有一會兒拉入請求,不知道目前的狀態是什麼),但你可以圍繞它通過使小陣列有點兒本事:

const(Dir)[1] pathSlow; 

然後將其稱爲pathSlow[0]

+0

好的。我也這麼想。 –