{\r
}\r
\r
+ /// <summary>\r
+ /// 依存解決済みInstallation配列を生成する\r
+ /// </summary>\r
+ /// <param name="insts">元のインストールリスト</param>\r
+ /// <param name="pkgListsMan">インストール確認などをおこなうパッケージリストのマネージャ</param>\r
+ /// <param name="resolved">解決済みInstallation配列</param>\r
+ /// <param name="dependencies">依存によって必要とされたInstallation配列。ない場合は空配列</param>\r
public static void ResolveInstallations(Installation[] insts, PackageListsManager pkgListsMan, out Installation[] resolved, out Installation[] dependencies)\r
{\r
List<Installation> depInsts;\r
{\r
List<Installation> reqInsts = new List<Installation>();\r
\r
- foreach (Entry entry in CreateRequiresEntries(insts, pkgListsMan)) {\r
- reqInsts.Add(new Installation(pkgListsMan.AvailablePkgList.GetPackageForEntry(entry)));\r
- }\r
- \r
- return reqInsts;\r
- }\r
- \r
- \r
- /// <summary>\r
- /// Requires依存による依存パッケージの検索をし、それをパッケージ参照エントリのイテレータで返す。\r
- /// 返されるイテレータは、インストール済み及び重複のパッケージは取り除かれている。\r
- /// </summary>\r
- /// <param name="insts">対象インストールリスト</param>\r
- /// <param name="pkgListsMan">現在インストールされているか否かの判断に使われるパッケージリスト</param>\r
- /// <returns>Requires依存による依存</returns>\r
- public static IEnumerable<Entry> CreateRequiresEntries(Installation[] insts, PackageListsManager pkgListsMan)\r
- {\r
foreach (Entry entry in DeleteDuplicatedEntries(CreateDependencyEntries(insts, "Requires"))) {\r
if (!pkgListsMan.IsInstalledFor(entry)) { \r
if (Array.Exists(insts, delegate(Installation inst) {\r
})) {\r
continue;\r
} else {\r
- yield return entry;\r
+ Package pkg = pkgListsMan.AvailablePkgList.GetPackageForEntry(entry);\r
+ reqInsts.Add(new Installation(pkg));\r
}\r
}\r
}\r
+ \r
+ return reqInsts;\r
}\r
\r
/// <summary>\r
/// <returns>重複しているものを取り除いたエントリのイテレータ</returns>\r
private static IEnumerable<Entry> DeleteDuplicatedEntries(IEnumerable<Entry> entries)\r
{\r
- List<string> pkgNames = new List<string>();\r
+ LinkedList<string> pkgNames = new LinkedList<string>();\r
\r
foreach (Entry entry in entries) {\r
- if (pkgNames.IndexOf(entry.Name) < 0) {\r
+ if (! pkgNames.Contains(entry.Name)) {\r
// 新出ならば返す\r
yield return entry;\r
- pkgNames.Add(entry.Name);\r
+ pkgNames.AddFirst(entry.Name);\r
}\r
}\r
}\r