// Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.FSharp.Collections
open System.Diagnostics
open Microsoft.FSharp.Collections
open Microsoft.FSharp.Core
open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators
open Microsoft.FSharp.Core.Operators
open Microsoft.FSharp.Core.Operators.Checked
[]
[]
module Array3D =
let inline checkNonNull argName arg =
match box arg with
| null -> nullArg argName
| _ -> ()
[]
let length1 (array: 'T[,,]) = (# "ldlen.multi 3 0" array : int #)
[]
let length2 (array: 'T[,,]) = (# "ldlen.multi 3 1" array : int #)
[]
let length3 (array: 'T[,,]) = (# "ldlen.multi 3 2" array : int #)
[]
let get (array: 'T[,,]) n1 n2 n3 = array.[n1,n2,n3]
[]
let set (array: 'T[,,]) n1 n2 n3 x = array.[n1,n2,n3] <- x
[]
let zeroCreate (n1:int) (n2:int) (n3:int) =
if n1 < 0 then invalidArg "n1" (SR.GetString(SR.inputMustBeNonNegative))
if n2 < 0 then invalidArg "n2" (SR.GetString(SR.inputMustBeNonNegative))
if n3 < 0 then invalidArg "n3" (SR.GetString(SR.inputMustBeNonNegative))
(# "newarr.multi 3 !0" type ('T) n1 n2 n3 : 'T[,,] #)
[]
let create (n1:int) (n2:int) (n3:int) (x:'T) =
let arr = (zeroCreate n1 n2 n3 : 'T[,,])
for i = 0 to n1 - 1 do
for j = 0 to n2 - 1 do
for k = 0 to n3 - 1 do
arr.[i,j,k] <- x
arr
[]
let init n1 n2 n3 f =
let arr = (zeroCreate n1 n2 n3 : 'T[,,])
for i = 0 to n1 - 1 do
for j = 0 to n2 - 1 do
for k = 0 to n3 - 1 do
arr.[i,j,k] <- f i j k
arr
[]
let iter f array =
checkNonNull "array" array
let len1 = length1 array
let len2 = length2 array
let len3 = length3 array
for i = 0 to len1 - 1 do
for j = 0 to len2 - 1 do
for k = 0 to len3 - 1 do
f array.[i,j,k]
[]
let map f array =
checkNonNull "array" array
let len1 = length1 array
let len2 = length2 array
let len3 = length3 array
let res = (zeroCreate len1 len2 len3 : 'b[,,])
for i = 0 to len1 - 1 do
for j = 0 to len2 - 1 do
for k = 0 to len3 - 1 do
res.[i,j,k] <- f array.[i,j,k]
res
[]
let iteri f array =
checkNonNull "array" array
let len1 = length1 array
let len2 = length2 array
let len3 = length3 array
for i = 0 to len1 - 1 do
for j = 0 to len2 - 1 do
for k = 0 to len3 - 1 do
f i j k array.[i,j,k]
[]
let mapi f array =
checkNonNull "array" array
let len1 = length1 array
let len2 = length2 array
let len3 = length3 array
let res = (zeroCreate len1 len2 len3 : 'b[,,])
for i = 0 to len1 - 1 do
for j = 0 to len2 - 1 do
for k = 0 to len3 - 1 do
res.[i,j,k] <- f i j k array.[i,j,k]
res
[]
[]
module Array4D =
[]
let length1 (array: 'T[,,,]) = (# "ldlen.multi 4 0" array : int #)
[]
let length2 (array: 'T[,,,]) = (# "ldlen.multi 4 1" array : int #)
[]
let length3 (array: 'T[,,,]) = (# "ldlen.multi 4 2" array : int #)
[]
let length4 (array: 'T[,,,]) = (# "ldlen.multi 4 3" array : int #)
[]
let zeroCreate (n1:int) (n2:int) (n3:int) (n4:int) =
if n1 < 0 then invalidArg "n1" (SR.GetString(SR.inputMustBeNonNegative))
if n2 < 0 then invalidArg "n2" (SR.GetString(SR.inputMustBeNonNegative))
if n3 < 0 then invalidArg "n3" (SR.GetString(SR.inputMustBeNonNegative))
if n4 < 0 then invalidArg "n4" (SR.GetString(SR.inputMustBeNonNegative))
(# "newarr.multi 4 !0" type ('T) n1 n2 n3 n4 : 'T[,,,] #)
[]
let create n1 n2 n3 n4 (x:'T) =
let arr = (zeroCreate n1 n2 n3 n4 : 'T[,,,])
for i = 0 to n1 - 1 do
for j = 0 to n2 - 1 do
for k = 0 to n3 - 1 do
for m = 0 to n4 - 1 do
arr.[i,j,k,m] <- x
arr
[]
let init n1 n2 n3 n4 f =
let arr = (zeroCreate n1 n2 n3 n4 : 'T[,,,])
for i = 0 to n1 - 1 do
for j = 0 to n2 - 1 do
for k = 0 to n3 - 1 do
for m = 0 to n4 - 1 do
arr.[i,j,k,m] <- f i j k m
arr
[]
let get (array: 'T[,,,]) n1 n2 n3 n4 = array.[n1,n2,n3,n4]
[]
let set (array: 'T[,,,]) n1 n2 n3 n4 x = array.[n1,n2,n3,n4] <- x