-
Notifications
You must be signed in to change notification settings - Fork 30
/
Copy pathFlatBoardStorage.cs
93 lines (82 loc) · 4.63 KB
/
FlatBoardStorage.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#region The MIT License - Copyright (C) 2012-2019 Pieter Geerkens
/////////////////////////////////////////////////////////////////////////////////////////
// PG Software Solutions - Hex-Grid Utilities
/////////////////////////////////////////////////////////////////////////////////////////
// The MIT License:
// ----------------
//
// Copyright (c) 2012-2019 Pieter Geerkens (email: pgeerkens@users.noreply.github.com)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify,
// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to the following
// conditions:
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
/////////////////////////////////////////////////////////////////////////////////////////
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using PGNapoleonics.HexUtilities.Common;
using PGNapoleonics.HexUtilities.FastLists;
namespace PGNapoleonics.HexUtilities.Storage {
using HexSize = System.Drawing.Size;
/// <summary>A row-major <c>BoardStorage</c> implementation optimized for small maps,
/// providing both serial and parallel initialization.</summary>
public sealed class FlatBoardStorage<T> : BoardStorage<T> {
/// <summary>Construct a new instance of extent <paramref name="sizeHexes"/> and
/// initialized using <paramref name="factory"/>.</summary>
/// <param name="sizeHexes"><c>Size</c> structure speccifying the Width and Height of
/// the desired board storage.</param>
/// <param name="factory"></param>
/// <param name="inParallel">Boolean indicating how the board should be initialized:
/// in parallel or serially.</param>
public FlatBoardStorage(HexSize sizeHexes, Func<HexCoords,T> factory, bool inParallel)
: base (sizeHexes) {
var rowRange = inParallel ? ParallelEnumerable.Range(0,sizeHexes.Height).AsOrdered()
: Enumerable.Range(0,sizeHexes.Height);
BackingStore = InitializeStoreX(sizeHexes, factory, rowRange);
}
private static IFastList<IFastListX<T>> InitializeStoreX(HexSize sizeHexes,
Func<HexCoords, T> tFactory, IEnumerable<int> rowRange)
=> ( from y in rowRange
select ( from x in Enumerable.Range(0, sizeHexes.Width)
select tFactory(HexCoords.NewUserCoords(x,y))
).ToArray().ToFastListX()
).ToArray().ToFastList();
/// <inheritdoc/>>
protected override T ItemInner(int x, int y) => BackingStore[y][x];
/// <inheritdoc/>>
public override void ForEach(Action<T> action)
=> BackingStore.AsParallel().WithMergeOptions(ParallelMergeOptions.FullyBuffered)
.ForAll(row => row.ForEach(action));
/// <inheritdoc/>>
public override void ForEach(FastIteratorFunctor<T> functor)
=> BackingStore.AsParallel().WithMergeOptions(ParallelMergeOptions.FullyBuffered)
.ForAll(row => row.ForEach(functor));
/// <inheritdoc/>>
public override void ForEachSerial(Action<T> action)
=> BackingStore.ForEach(row => row.ForEach(action));
/// <inheritdoc/>>
public override void ForEachSerial(FastIteratorFunctor<T> functor)
=> BackingStore.ForEach(row => row.ForEach(functor));
/// <summary>TODO</summary>
/// <remarks>Use carefully - can interfere with iterators.</remarks>
internal override void SetItem(HexCoords coords, T value)
//=> BackingStore[coords.User.Y].SetItem(coords.User.X, value);
=> BackingStore[coords.User.Y].SetItem(coords.User.X, value);
private IFastList<IFastListX<T>> BackingStore { get; }
}
}