Skip to content

Commit 860261f

Browse files
authored
Minor grid code fix (#272)
* getGridCodesの戻り値をconstに * 微修正
1 parent 0917ffb commit 860261f

File tree

9 files changed

+27
-56
lines changed

9 files changed

+27
-56
lines changed

include/plateau/dataset/i_dataset_accessor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ namespace plateau::dataset {
132132
/**
133133
* \brief 都市モデルデータが存在する地域メッシュのリストを取得します。
134134
*/
135-
virtual std::set<std::shared_ptr<GridCode>, GridCodeComparator>& getGridCodes() = 0;
135+
virtual const std::set<std::shared_ptr<GridCode>, GridCodeComparator>& getGridCodes() = 0;
136136

137137
virtual TVec3d calculateCenterPoint(const plateau::geometry::GeoReference& geo_reference) = 0;
138138

src/dataset/local_dataset_accessor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ namespace plateau::dataset {
301301
return fs::relative(fs::u8path(path).make_preferred(), fs::u8path(udx_path_)).make_preferred().string();
302302
}
303303

304-
std::set<std::shared_ptr<GridCode>, GridCodeComparator>& LocalDatasetAccessor::getGridCodes() {
304+
const std::set<std::shared_ptr<GridCode>, GridCodeComparator>& LocalDatasetAccessor::getGridCodes() {
305305
if (grid_codes_.empty()) {
306306
for (const auto& [_, files]: files_) {
307307
for (const auto& file: files) {

src/dataset/local_dataset_accessor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ namespace plateau::dataset {
6868
/**
6969
* \brief 都市モデルデータが存在するGridCodeのリストを取得します。
7070
*/
71-
std::set<std::shared_ptr<GridCode>, GridCodeComparator>& getGridCodes() override;
71+
const std::set<std::shared_ptr<GridCode>, GridCodeComparator>& getGridCodes() override;
7272

7373
std::string getRelativePath(const std::string& path) const;
7474
std::string getU8RelativePath(const std::string& path) const;

src/dataset/server_dataset_accessor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ namespace plateau::dataset {
2121
grid_codes_.clear();
2222
}
2323

24-
std::set<std::shared_ptr<GridCode>, GridCodeComparator>& ServerDatasetAccessor::getGridCodes() {
24+
const std::set<std::shared_ptr<GridCode>, GridCodeComparator>& ServerDatasetAccessor::getGridCodes() {
2525
if (grid_codes_.empty()) {
2626
for (const auto& [_, files] : dataset_files_) {
2727
for (const auto& file : files) {

src/dataset/server_dataset_accessor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace plateau::dataset {
1818

1919
void loadFromServer();
2020

21-
std::set<std::shared_ptr<GridCode>, GridCodeComparator>& getGridCodes() override;
21+
const std::set<std::shared_ptr<GridCode>, GridCodeComparator>& getGridCodes() override;
2222
std::shared_ptr<std::vector<GmlFile>> getGmlFiles(PredefinedCityModelPackage package) override;
2323
void getGmlFiles(PredefinedCityModelPackage package_flags, std::vector<GmlFile>& out_gml_files) override;
2424

wrappers/csharp/LibPLATEAU.NET/CSharpPLATEAU/Dataset/DatasetAccessor.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ public NativeVectorGmlFile GetAllGmlFiles()
4141
return GetGmlFiles((PredefinedCityModelPackage)allPackages);
4242
}
4343

44+
/// <summary>
45+
/// C++側のvectorとしてのGridCodeを返します。
46+
/// 注意:受け取る側でusingを付けるなど、廃棄されるようにしてください。
47+
/// </summary>
4448
public NativeVectorGridCode GridCodes
4549
{
4650
get
@@ -79,7 +83,7 @@ public DatasetAccessor FilterByGridCodes(IEnumerable<GridCode> gridCodes)
7983
var nativeGridCodes = NativeVectorGridCode.Create();
8084
foreach (var gridCode in gridCodes)
8185
{
82-
nativeGridCodes.Add(gridCode);
86+
nativeGridCodes.AddCopyOf(gridCode);
8387
}
8488

8589
var result = NativeMethods.plateau_i_dataset_accessor_filter_by_grid_codes(

wrappers/csharp/LibPLATEAU.NET/CSharpPLATEAU/Dataset/GmlFile.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ public PredefinedCityModelPackage Package {
8181
/// GMLファイルのGridCodeを返します。
8282
/// ただし、誤った形式のGMLファイル名である等の理由でGridCodeを読み取れなかった場合は
8383
/// 戻り値の isValid が false になります。
84+
/// 戻り値が解放されるようにするためにusingを付けてください。
8485
/// </summary>
8586
public GridCode GridCode
8687
{
@@ -89,6 +90,7 @@ public GridCode GridCode
8990
ThrowIfDisposed();
9091
var gridCodePtr = DLLUtil.GetNativeValue<IntPtr>(Handle,
9192
NativeMethods.plateau_gml_file_get_grid_code);
93+
// gridCodePtrの寿命管理はC++側に任せるのでここでは解放しませんが、copiedはC#から解放する必要があります。
9294
var copied = GridCode.CopyFrom(gridCodePtr);
9395
return copied;
9496
}

wrappers/csharp/LibPLATEAU.NET/CSharpPLATEAU/Dataset/MeshCode.cs

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -21,51 +21,5 @@ public struct MeshCode
2121
public readonly int Level;
2222
[MarshalAs(UnmanagedType.U1)] private readonly bool isValid;
2323

24-
private static bool getHalfMeshNumber(out int num, int row, int col)
25-
{
26-
if (row < 0 || row > 1 ||
27-
col < 0 || col > 1)
28-
{
29-
num = 0;
30-
return false;
31-
}
32-
33-
// 番号順に左下→右下→左上→右上
34-
num = row * 2 + col + 1;
35-
return true;
36-
}
37-
38-
public override string ToString()
39-
{
40-
// ThrowIfInvalid();
41-
string secondString = Level2();
42-
if (this.Level == 2)
43-
return secondString;
44-
45-
string thirdString = secondString + $"{this.ThirdRow | 0}{this.ThirdCol | 0}";
46-
if (this.Level == 3)
47-
return thirdString;
48-
49-
getHalfMeshNumber(out int fourthNum, this.FourthRow, this.FourthCol);
50-
string fourthString = thirdString + $"{fourthNum}";
51-
if (this.Level == 4)
52-
return fourthString;
53-
54-
getHalfMeshNumber(out int fifthNum, this.FifthRow, this.FifthCol);
55-
string fifthString = fourthString + $"{fifthNum}";
56-
return fifthString;
57-
}
58-
59-
public string Level2()
60-
{
61-
// ThrowIfInvalid();
62-
return $"{this.FirstRow | 00}{this.FirstCol | 00}{this.SecondRow | 0}{this.SecondCol | 0}";
63-
}
64-
65-
public string Level3()
66-
{
67-
// ThrowIfInvalid();
68-
return $"{Level2()}{this.ThirdRow | 0}{this.ThirdCol | 0}";
69-
}
7024
}
7125
}

wrappers/csharp/LibPLATEAU.NET/CSharpPLATEAU/Native/NativeVectorGridCode.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ namespace PLATEAU.Native
77
{
88
/// <summary>
99
/// GridCodeのC++ Vectorです。
10-
/// 中身はVectorの廃棄時の削除するので、それまでは中身が削除されないよう注意してください。
10+
/// 中身はVectorの廃棄時に削除されます。
11+
/// ダングリングを防ぐため、vectorへの追加・参照時はコピーを渡します。
1112
/// </summary>
1213
public class NativeVectorGridCode : NativeVectorDisposableBase<GridCode>
1314
{
@@ -21,6 +22,9 @@ public static NativeVectorGridCode Create()
2122
return new NativeVectorGridCode(ptr);
2223
}
2324

25+
/// <summary>
26+
/// インデックスでアクセスし、そのコピーを返します。
27+
/// </summary>
2428
public override GridCode At(int index)
2529
{
2630
ThrowIfDisposed();
@@ -40,11 +44,18 @@ public override int Length
4044
}
4145
}
4246

43-
public void Add(GridCode gridCode)
47+
/// <summary>
48+
/// 追加します。ただし、無効なGridCodeの場合は何もしません。
49+
/// </summary>
50+
public void AddCopyOf(GridCode gridCode)
4451
{
45-
gridCode.PreventAutoDispose();
52+
if (!gridCode.IsValid) return;
53+
// ダングリングを防ぐためコピーを追加します。
54+
var copied = GridCode.CopyFrom(gridCode.Handle);
55+
// vectorが廃棄されるまでGridCodeが廃棄されないようにします。
56+
copied.PreventAutoDispose();
4657
var result = NativeMethods.plateau_vector_grid_code_push_back_value(
47-
Handle, gridCode.Handle);
58+
Handle, copied.Handle);
4859
DLLUtil.CheckDllError(result);
4960
}
5061

0 commit comments

Comments
 (0)