blob: f911ff3b86f36237a3cc2ccab719a6d791b4f52f [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*-<a name="line.1"></a>
<span class="sourceLineNo">002</span> *******************************************************************************<a name="line.2"></a>
<span class="sourceLineNo">003</span> * Copyright (c) 2011, 2016 Diamond Light Source Ltd.<a name="line.3"></a>
<span class="sourceLineNo">004</span> * All rights reserved. This program and the accompanying materials<a name="line.4"></a>
<span class="sourceLineNo">005</span> * are made available under the terms of the Eclipse Public License v1.0<a name="line.5"></a>
<span class="sourceLineNo">006</span> * which accompanies this distribution, and is available at<a name="line.6"></a>
<span class="sourceLineNo">007</span> * http://www.eclipse.org/legal/epl-v10.html<a name="line.7"></a>
<span class="sourceLineNo">008</span> *<a name="line.8"></a>
<span class="sourceLineNo">009</span> * Contributors:<a name="line.9"></a>
<span class="sourceLineNo">010</span> * Peter Chang - initial API and implementation and/or initial documentation<a name="line.10"></a>
<span class="sourceLineNo">011</span> *******************************************************************************/<a name="line.11"></a>
<span class="sourceLineNo">012</span><a name="line.12"></a>
<span class="sourceLineNo">013</span>package org.eclipse.january.dataset;<a name="line.13"></a>
<span class="sourceLineNo">014</span><a name="line.14"></a>
<span class="sourceLineNo">015</span>import java.io.Serializable;<a name="line.15"></a>
<span class="sourceLineNo">016</span><a name="line.16"></a>
<span class="sourceLineNo">017</span>/** <a name="line.17"></a>
<span class="sourceLineNo">018</span> * The {@code Slice} class represents the set of indices (start, stop, step), that are used to extract specifics subsets of {@link org.eclipse.january.dataset.Dataset}.&lt;br&gt;&lt;br&gt;<a name="line.18"></a>
<span class="sourceLineNo">019</span> * The start argument default to 0, stop argument default to the stop argument default to the end of the dimension that the slice is applied to, and the default argument for the step is 1.<a name="line.19"></a>
<span class="sourceLineNo">020</span> * &lt;br&gt;&lt;br&gt;<a name="line.20"></a>
<span class="sourceLineNo">021</span> * The start index is inclusive, for example, if we want to get data from index 1, so sliceData will be &lt;b&gt;[2,3]&lt;/b&gt; :<a name="line.21"></a>
<span class="sourceLineNo">022</span> * &lt;pre&gt;<a name="line.22"></a>
<span class="sourceLineNo">023</span>* {@code<a name="line.23"></a>
<span class="sourceLineNo">024</span>* final Dataset onedData = DatasetFactory.createFromObject(new int[]{1,2,3});<a name="line.24"></a>
<span class="sourceLineNo">025</span>* Dataset sliceData = onedData.getSlice(new Slice(1, null, null));<a name="line.25"></a>
<span class="sourceLineNo">026</span>* }<a name="line.26"></a>
<span class="sourceLineNo">027</span>* &lt;/pre&gt;<a name="line.27"></a>
<span class="sourceLineNo">028</span>* <a name="line.28"></a>
<span class="sourceLineNo">029</span>* If Slice is specified with only one argument, this will be the stop index which is exclusive. In this case sliceData will be &lt;b&gt;[1,2]&lt;/b&gt; :<a name="line.29"></a>
<span class="sourceLineNo">030</span> * &lt;pre&gt;<a name="line.30"></a>
<span class="sourceLineNo">031</span>* {@code<a name="line.31"></a>
<span class="sourceLineNo">032</span>* final Dataset onedData = DatasetFactory.createFromObject(new int[]{1,2,3});<a name="line.32"></a>
<span class="sourceLineNo">033</span>* Dataset sliceData = onedData.getSlice(new Slice(2));<a name="line.33"></a>
<span class="sourceLineNo">034</span>* }<a name="line.34"></a>
<span class="sourceLineNo">035</span>* &lt;/pre&gt;<a name="line.35"></a>
<span class="sourceLineNo">036</span>* <a name="line.36"></a>
<span class="sourceLineNo">037</span>* To create a 1D Slice, so sliceData is : &lt;b&gt;[6, 5, 4]&lt;/b&gt;, we will do :<a name="line.37"></a>
<span class="sourceLineNo">038</span>* &lt;pre&gt;<a name="line.38"></a>
<span class="sourceLineNo">039</span>* {@code<a name="line.39"></a>
<span class="sourceLineNo">040</span>* final Dataset sliceData = DatasetFactory.createFromObject(new int[]{10,9,8,7,6,5,4,3,2,1,0});<a name="line.40"></a>
<span class="sourceLineNo">041</span>* Dataset newOnedData = sliceData.getSlice(new Slice(4, 7, 1));<a name="line.41"></a>
<span class="sourceLineNo">042</span>* }<a name="line.42"></a>
<span class="sourceLineNo">043</span>* &lt;/pre&gt;<a name="line.43"></a>
<span class="sourceLineNo">044</span>* &lt;br&gt;<a name="line.44"></a>
<span class="sourceLineNo">045</span>* For more informations, see the sliceFrom1D example in SlicingExamples.<a name="line.45"></a>
<span class="sourceLineNo">046</span> */<a name="line.46"></a>
<span class="sourceLineNo">047</span>public class Slice implements Cloneable, Serializable {<a name="line.47"></a>
<span class="sourceLineNo">048</span><a name="line.48"></a>
<span class="sourceLineNo">049</span> private static final long serialVersionUID = 3714928852236201310L;<a name="line.49"></a>
<span class="sourceLineNo">050</span> private Integer start;<a name="line.50"></a>
<span class="sourceLineNo">051</span> private Integer stop;<a name="line.51"></a>
<span class="sourceLineNo">052</span> private int step;<a name="line.52"></a>
<span class="sourceLineNo">053</span><a name="line.53"></a>
<span class="sourceLineNo">054</span> private int length; // max length of dimension<a name="line.54"></a>
<span class="sourceLineNo">055</span><a name="line.55"></a>
<span class="sourceLineNo">056</span> /**<a name="line.56"></a>
<span class="sourceLineNo">057</span> * Constructs a Slice object with the start and the stop value representing<a name="line.57"></a>
<span class="sourceLineNo">058</span> * the entirety of the sliced dimension of the Dataset.<a name="line.58"></a>
<span class="sourceLineNo">059</span> */<a name="line.59"></a>
<span class="sourceLineNo">060</span> public Slice() {<a name="line.60"></a>
<span class="sourceLineNo">061</span> this(null, null, 1);<a name="line.61"></a>
<span class="sourceLineNo">062</span> }<a name="line.62"></a>
<span class="sourceLineNo">063</span><a name="line.63"></a>
<span class="sourceLineNo">064</span> /**<a name="line.64"></a>
<span class="sourceLineNo">065</span> * Constructs a Slice object with, by default the start set to 0 and with a<a name="line.65"></a>
<span class="sourceLineNo">066</span> * step of 1. If the stop point of the Slice is {@code null}, it will be set<a name="line.66"></a>
<span class="sourceLineNo">067</span> * to the stop argument default to the end of the dimension that the slice<a name="line.67"></a>
<span class="sourceLineNo">068</span> * is applied to.<a name="line.68"></a>
<span class="sourceLineNo">069</span> * <a name="line.69"></a>
<span class="sourceLineNo">070</span> * @param stop<a name="line.70"></a>
<span class="sourceLineNo">071</span> * the stop point of the Slice<a name="line.71"></a>
<span class="sourceLineNo">072</span> */<a name="line.72"></a>
<span class="sourceLineNo">073</span> public Slice(final Integer stop) {<a name="line.73"></a>
<span class="sourceLineNo">074</span> this(null, stop, 1);<a name="line.74"></a>
<span class="sourceLineNo">075</span> }<a name="line.75"></a>
<span class="sourceLineNo">076</span><a name="line.76"></a>
<span class="sourceLineNo">077</span> /**<a name="line.77"></a>
<span class="sourceLineNo">078</span> * Constructs a Slice object with, by default a step of 1. If the start<a name="line.78"></a>
<span class="sourceLineNo">079</span> * point of the Slice is {@code null}, it will be set automatically to 0. If<a name="line.79"></a>
<span class="sourceLineNo">080</span> * the stop point of the Slice is {@code null}, it will be set to the stop<a name="line.80"></a>
<span class="sourceLineNo">081</span> * argument default to the end of the dimension that the slice is applied<a name="line.81"></a>
<span class="sourceLineNo">082</span> * to.<a name="line.82"></a>
<span class="sourceLineNo">083</span> * <a name="line.83"></a>
<span class="sourceLineNo">084</span> * @param start<a name="line.84"></a>
<span class="sourceLineNo">085</span> * the start point of the Slice<a name="line.85"></a>
<span class="sourceLineNo">086</span> * @param stop<a name="line.86"></a>
<span class="sourceLineNo">087</span> * the stop point of the Slice<a name="line.87"></a>
<span class="sourceLineNo">088</span> */<a name="line.88"></a>
<span class="sourceLineNo">089</span> public Slice(final Integer start, final Integer stop) {<a name="line.89"></a>
<span class="sourceLineNo">090</span> this(start, stop, 1);<a name="line.90"></a>
<span class="sourceLineNo">091</span> }<a name="line.91"></a>
<span class="sourceLineNo">092</span><a name="line.92"></a>
<span class="sourceLineNo">093</span> /**<a name="line.93"></a>
<span class="sourceLineNo">094</span> * Constructs a Slice object on which it is possible to chooe the start, the<a name="line.94"></a>
<span class="sourceLineNo">095</span> * stop and the step. If the start point of the Slice is {@code null}, it<a name="line.95"></a>
<span class="sourceLineNo">096</span> * will be set automatically to 0. If the stop point of the Slice is<a name="line.96"></a>
<span class="sourceLineNo">097</span> * {@code null}, it will be set to the stop argument default to the end of<a name="line.97"></a>
<span class="sourceLineNo">098</span> * the dimension that the slice is applied to. If the the wanted step is set<a name="line.98"></a>
<span class="sourceLineNo">099</span> * to {@code null}, it will be set by default to 1.<a name="line.99"></a>
<span class="sourceLineNo">100</span> * <a name="line.100"></a>
<span class="sourceLineNo">101</span> * @param start<a name="line.101"></a>
<span class="sourceLineNo">102</span> * the start point of the Slice, may be {@code null}<a name="line.102"></a>
<span class="sourceLineNo">103</span> * @param stop<a name="line.103"></a>
<span class="sourceLineNo">104</span> * the stop point of the Slice, may be {@code null}<a name="line.104"></a>
<span class="sourceLineNo">105</span> * @param step<a name="line.105"></a>
<span class="sourceLineNo">106</span> * the step wanted to browse the Dataset, may be {@code null}<a name="line.106"></a>
<span class="sourceLineNo">107</span> */<a name="line.107"></a>
<span class="sourceLineNo">108</span> public Slice(final Integer start, final Integer stop, final Integer step) {<a name="line.108"></a>
<span class="sourceLineNo">109</span> this.start = start;<a name="line.109"></a>
<span class="sourceLineNo">110</span> this.stop = stop;<a name="line.110"></a>
<span class="sourceLineNo">111</span> this.step = step == null ? 1 : step;<a name="line.111"></a>
<span class="sourceLineNo">112</span> length = -1;<a name="line.112"></a>
<span class="sourceLineNo">113</span> }<a name="line.113"></a>
<span class="sourceLineNo">114</span><a name="line.114"></a>
<span class="sourceLineNo">115</span> /**<a name="line.115"></a>
<span class="sourceLineNo">116</span> * Copy another slice<a name="line.116"></a>
<span class="sourceLineNo">117</span> * <a name="line.117"></a>
<span class="sourceLineNo">118</span> * @param other<a name="line.118"></a>
<span class="sourceLineNo">119</span> */<a name="line.119"></a>
<span class="sourceLineNo">120</span> private Slice(final Slice other) {<a name="line.120"></a>
<span class="sourceLineNo">121</span> start = other.start;<a name="line.121"></a>
<span class="sourceLineNo">122</span> stop = other.stop;<a name="line.122"></a>
<span class="sourceLineNo">123</span> step = other.step;<a name="line.123"></a>
<span class="sourceLineNo">124</span> length = other.length;<a name="line.124"></a>
<span class="sourceLineNo">125</span> }<a name="line.125"></a>
<span class="sourceLineNo">126</span><a name="line.126"></a>
<span class="sourceLineNo">127</span> /**<a name="line.127"></a>
<span class="sourceLineNo">128</span> * Creates a deep copy of the Slice.<a name="line.128"></a>
<span class="sourceLineNo">129</span> * <a name="line.129"></a>
<span class="sourceLineNo">130</span> * @return New Slice with the current Slice properties<a name="line.130"></a>
<span class="sourceLineNo">131</span> */<a name="line.131"></a>
<span class="sourceLineNo">132</span> @Override<a name="line.132"></a>
<span class="sourceLineNo">133</span> public Slice clone() {<a name="line.133"></a>
<span class="sourceLineNo">134</span> return new Slice(this);<a name="line.134"></a>
<span class="sourceLineNo">135</span> }<a name="line.135"></a>
<span class="sourceLineNo">136</span><a name="line.136"></a>
<span class="sourceLineNo">137</span> /**<a name="line.137"></a>
<span class="sourceLineNo">138</span> * Sets the maximal dimensions length of the Slice.<a name="line.138"></a>
<span class="sourceLineNo">139</span> * <a name="line.139"></a>
<span class="sourceLineNo">140</span> * @param length<a name="line.140"></a>
<span class="sourceLineNo">141</span> * Wanted size of dimensions<a name="line.141"></a>
<span class="sourceLineNo">142</span> * @return The Slice which the method is called on<a name="line.142"></a>
<span class="sourceLineNo">143</span> */<a name="line.143"></a>
<span class="sourceLineNo">144</span> public Slice setLength(int length) {<a name="line.144"></a>
<span class="sourceLineNo">145</span> if (stop != null &amp;&amp; step &gt; 0 &amp;&amp; length &lt; stop) {<a name="line.145"></a>
<span class="sourceLineNo">146</span> throw new IllegalArgumentException("Length must be greater than or equal to stop");<a name="line.146"></a>
<span class="sourceLineNo">147</span> }<a name="line.147"></a>
<span class="sourceLineNo">148</span> if (start != null &amp;&amp; step &lt; 0 &amp;&amp; length &lt; start) {<a name="line.148"></a>
<span class="sourceLineNo">149</span> throw new IllegalArgumentException("Length must be greater than or equal to start");<a name="line.149"></a>
<span class="sourceLineNo">150</span> }<a name="line.150"></a>
<span class="sourceLineNo">151</span> this.length = length;<a name="line.151"></a>
<span class="sourceLineNo">152</span> return this;<a name="line.152"></a>
<span class="sourceLineNo">153</span> }<a name="line.153"></a>
<span class="sourceLineNo">154</span><a name="line.154"></a>
<span class="sourceLineNo">155</span> /**<a name="line.155"></a>
<span class="sourceLineNo">156</span> * Returns {@code true} if the slice has a maximum size equal to the current<a name="line.156"></a>
<span class="sourceLineNo">157</span> * size, else {@code false}.<a name="line.157"></a>
<span class="sourceLineNo">158</span> * <a name="line.158"></a>
<span class="sourceLineNo">159</span> * @return {@code true} if slice represents complete dimension,<a name="line.159"></a>
<span class="sourceLineNo">160</span> * {@code false} in the other case.<a name="line.160"></a>
<span class="sourceLineNo">161</span> */<a name="line.161"></a>
<span class="sourceLineNo">162</span> public boolean isSliceComplete() {<a name="line.162"></a>
<span class="sourceLineNo">163</span> if (start == null &amp;&amp; stop == null &amp;&amp; (step == 1 || step == -1))<a name="line.163"></a>
<span class="sourceLineNo">164</span> return true;<a name="line.164"></a>
<span class="sourceLineNo">165</span> if (length &gt; 0) {<a name="line.165"></a>
<span class="sourceLineNo">166</span> return getNumSteps() == length;<a name="line.166"></a>
<span class="sourceLineNo">167</span> }<a name="line.167"></a>
<span class="sourceLineNo">168</span><a name="line.168"></a>
<span class="sourceLineNo">169</span> return true;<a name="line.169"></a>
<span class="sourceLineNo">170</span> }<a name="line.170"></a>
<span class="sourceLineNo">171</span><a name="line.171"></a>
<span class="sourceLineNo">172</span> /**<a name="line.172"></a>
<span class="sourceLineNo">173</span> * Returns the maximum value of the slice.<a name="line.173"></a>
<span class="sourceLineNo">174</span> * <a name="line.174"></a>
<span class="sourceLineNo">175</span> * @return Maximum value of the slice<a name="line.175"></a>
<span class="sourceLineNo">176</span> */<a name="line.176"></a>
<span class="sourceLineNo">177</span> public int getLength() {<a name="line.177"></a>
<span class="sourceLineNo">178</span> return length;<a name="line.178"></a>
<span class="sourceLineNo">179</span> }<a name="line.179"></a>
<span class="sourceLineNo">180</span><a name="line.180"></a>
<span class="sourceLineNo">181</span> /**<a name="line.181"></a>
<span class="sourceLineNo">182</span> * Returns the starting index of the slice.<a name="line.182"></a>
<span class="sourceLineNo">183</span> * <a name="line.183"></a>
<span class="sourceLineNo">184</span> * @return Start point of the slice<a name="line.184"></a>
<span class="sourceLineNo">185</span> */<a name="line.185"></a>
<span class="sourceLineNo">186</span> public Integer getStart() {<a name="line.186"></a>
<span class="sourceLineNo">187</span> return start;<a name="line.187"></a>
<span class="sourceLineNo">188</span> }<a name="line.188"></a>
<span class="sourceLineNo">189</span><a name="line.189"></a>
<span class="sourceLineNo">190</span> /**<a name="line.190"></a>
<span class="sourceLineNo">191</span> * Returns the stopping index of the slice.<a name="line.191"></a>
<span class="sourceLineNo">192</span> * <a name="line.192"></a>
<span class="sourceLineNo">193</span> * @return Stop point of the slice<a name="line.193"></a>
<span class="sourceLineNo">194</span> */<a name="line.194"></a>
<span class="sourceLineNo">195</span> public Integer getStop() {<a name="line.195"></a>
<span class="sourceLineNo">196</span> return stop;<a name="line.196"></a>
<span class="sourceLineNo">197</span> }<a name="line.197"></a>
<span class="sourceLineNo">198</span><a name="line.198"></a>
<span class="sourceLineNo">199</span> /**<a name="line.199"></a>
<span class="sourceLineNo">200</span> * Returns the step of the slice.<a name="line.200"></a>
<span class="sourceLineNo">201</span> * <a name="line.201"></a>
<span class="sourceLineNo">202</span> * @return Step of the slice<a name="line.202"></a>
<span class="sourceLineNo">203</span> */<a name="line.203"></a>
<span class="sourceLineNo">204</span> public int getStep() {<a name="line.204"></a>
<span class="sourceLineNo">205</span> return step;<a name="line.205"></a>
<span class="sourceLineNo">206</span> }<a name="line.206"></a>
<span class="sourceLineNo">207</span><a name="line.207"></a>
<span class="sourceLineNo">208</span> /**<a name="line.208"></a>
<span class="sourceLineNo">209</span> * Set the starting index of the slice. If the start point of the Slice is<a name="line.209"></a>
<span class="sourceLineNo">210</span> * {@code null}, it will be set automatically to 0.<a name="line.210"></a>
<span class="sourceLineNo">211</span> * <a name="line.211"></a>
<span class="sourceLineNo">212</span> * @param start<a name="line.212"></a>
<span class="sourceLineNo">213</span> * Starting index of the Slice, may be {@code null}<a name="line.213"></a>
<span class="sourceLineNo">214</span> */<a name="line.214"></a>
<span class="sourceLineNo">215</span> public void setStart(Integer start) {<a name="line.215"></a>
<span class="sourceLineNo">216</span> if (start != null &amp;&amp; length &gt; 0) {<a name="line.216"></a>
<span class="sourceLineNo">217</span> if (step &gt; 0) {<a name="line.217"></a>
<span class="sourceLineNo">218</span> int end = stop == null ? length : stop;<a name="line.218"></a>
<span class="sourceLineNo">219</span> if (start &gt;= end) {<a name="line.219"></a>
<span class="sourceLineNo">220</span> throw new IllegalArgumentException("Non-null start must be less than end");<a name="line.220"></a>
<span class="sourceLineNo">221</span> }<a name="line.221"></a>
<span class="sourceLineNo">222</span> } else {<a name="line.222"></a>
<span class="sourceLineNo">223</span> int end = stop == null ? -1 : stop;<a name="line.223"></a>
<span class="sourceLineNo">224</span> if (start &lt; end) {<a name="line.224"></a>
<span class="sourceLineNo">225</span> throw new IllegalArgumentException("Non-null start must be greater than end for negative step");<a name="line.225"></a>
<span class="sourceLineNo">226</span> }<a name="line.226"></a>
<span class="sourceLineNo">227</span> }<a name="line.227"></a>
<span class="sourceLineNo">228</span> }<a name="line.228"></a>
<span class="sourceLineNo">229</span> this.start = start;<a name="line.229"></a>
<span class="sourceLineNo">230</span> }<a name="line.230"></a>
<span class="sourceLineNo">231</span><a name="line.231"></a>
<span class="sourceLineNo">232</span> /**<a name="line.232"></a>
<span class="sourceLineNo">233</span> * Set the stopping index of the slice. If the stop point of the Slice is<a name="line.233"></a>
<span class="sourceLineNo">234</span> * {@code null}, it will be set to the stop argument default to the end of<a name="line.234"></a>
<span class="sourceLineNo">235</span> * the dimension that the slice is applied to.<a name="line.235"></a>
<span class="sourceLineNo">236</span> * <a name="line.236"></a>
<span class="sourceLineNo">237</span> * @param stop<a name="line.237"></a>
<span class="sourceLineNo">238</span> * Stopping index of the Slice, may be {@code null}<a name="line.238"></a>
<span class="sourceLineNo">239</span> */<a name="line.239"></a>
<span class="sourceLineNo">240</span> public void setStop(Integer stop) {<a name="line.240"></a>
<span class="sourceLineNo">241</span> if (stop != null &amp;&amp; length &gt; 0) {<a name="line.241"></a>
<span class="sourceLineNo">242</span> if (step &gt; 0) {<a name="line.242"></a>
<span class="sourceLineNo">243</span> int beg = start == null ? 0 : start;<a name="line.243"></a>
<span class="sourceLineNo">244</span> if (stop &lt; beg) {<a name="line.244"></a>
<span class="sourceLineNo">245</span> throw new IllegalArgumentException("Non-null stop must be greater than or equal to beginning");<a name="line.245"></a>
<span class="sourceLineNo">246</span> }<a name="line.246"></a>
<span class="sourceLineNo">247</span> } else {<a name="line.247"></a>
<span class="sourceLineNo">248</span> int beg = start == null ? length - 1 : start;<a name="line.248"></a>
<span class="sourceLineNo">249</span> if (stop &gt;= beg) {<a name="line.249"></a>
<span class="sourceLineNo">250</span> throw new IllegalArgumentException("Non-null stop must be less than beginning for negative step");<a name="line.250"></a>
<span class="sourceLineNo">251</span> }<a name="line.251"></a>
<span class="sourceLineNo">252</span> }<a name="line.252"></a>
<span class="sourceLineNo">253</span> if (stop &gt; length)<a name="line.253"></a>
<span class="sourceLineNo">254</span> stop = length;<a name="line.254"></a>
<span class="sourceLineNo">255</span> }<a name="line.255"></a>
<span class="sourceLineNo">256</span> this.stop = stop;<a name="line.256"></a>
<span class="sourceLineNo">257</span> }<a name="line.257"></a>
<span class="sourceLineNo">258</span><a name="line.258"></a>
<span class="sourceLineNo">259</span> /**<a name="line.259"></a>
<span class="sourceLineNo">260</span> * Move the start and end to an other index keeping the same step and the<a name="line.260"></a>
<span class="sourceLineNo">261</span> * same gap between the two values<a name="line.261"></a>
<span class="sourceLineNo">262</span> * <a name="line.262"></a>
<span class="sourceLineNo">263</span> * @param beg<a name="line.263"></a>
<span class="sourceLineNo">264</span> * New starting point<a name="line.264"></a>
<span class="sourceLineNo">265</span> * @return Return {@code true} if the end was reached, {@code false} in the<a name="line.265"></a>
<span class="sourceLineNo">266</span> * other case.<a name="line.266"></a>
<span class="sourceLineNo">267</span> */<a name="line.267"></a>
<span class="sourceLineNo">268</span> public boolean setPosition(int beg) {<a name="line.268"></a>
<span class="sourceLineNo">269</span> boolean end = false;<a name="line.269"></a>
<span class="sourceLineNo">270</span> int len = getNumSteps();<a name="line.270"></a>
<span class="sourceLineNo">271</span> int max = getNumSteps(beg, length, step);<a name="line.271"></a>
<span class="sourceLineNo">272</span> if (len &gt; max) {<a name="line.272"></a>
<span class="sourceLineNo">273</span> len = max;<a name="line.273"></a>
<span class="sourceLineNo">274</span> end = true;<a name="line.274"></a>
<span class="sourceLineNo">275</span> }<a name="line.275"></a>
<span class="sourceLineNo">276</span> start = beg;<a name="line.276"></a>
<span class="sourceLineNo">277</span> stop = start + (len - 1) * step + 1;<a name="line.277"></a>
<span class="sourceLineNo">278</span> return end;<a name="line.278"></a>
<span class="sourceLineNo">279</span> }<a name="line.279"></a>
<span class="sourceLineNo">280</span><a name="line.280"></a>
<span class="sourceLineNo">281</span> /**<a name="line.281"></a>
<span class="sourceLineNo">282</span> * Returns the index of the n-th step inside of the slice<a name="line.282"></a>
<span class="sourceLineNo">283</span> * <a name="line.283"></a>
<span class="sourceLineNo">284</span> * @param n<a name="line.284"></a>
<span class="sourceLineNo">285</span> * Wanted step index in the slice<a name="line.285"></a>
<span class="sourceLineNo">286</span> * @return Return the index of the step inside of the Slice<a name="line.286"></a>
<span class="sourceLineNo">287</span> */<a name="line.287"></a>
<span class="sourceLineNo">288</span> public int getPosition(int n) {<a name="line.288"></a>
<span class="sourceLineNo">289</span> if (n &lt; 0)<a name="line.289"></a>
<span class="sourceLineNo">290</span> throw new IllegalArgumentException("Given n-th step should be non-negative");<a name="line.290"></a>
<span class="sourceLineNo">291</span> if (n &gt;= getNumSteps())<a name="line.291"></a>
<span class="sourceLineNo">292</span> throw new IllegalArgumentException("N-th step exceeds extent of slice");<a name="line.292"></a>
<span class="sourceLineNo">293</span> int beg;<a name="line.293"></a>
<span class="sourceLineNo">294</span> if (start == null) {<a name="line.294"></a>
<span class="sourceLineNo">295</span> if (step &lt; 0) {<a name="line.295"></a>
<span class="sourceLineNo">296</span> if (length &lt; 0) {<a name="line.296"></a>
<span class="sourceLineNo">297</span> if (stop == null) {<a name="line.297"></a>
<span class="sourceLineNo">298</span> throw new IllegalStateException("Length or stop should be set");<a name="line.298"></a>
<span class="sourceLineNo">299</span> }<a name="line.299"></a>
<span class="sourceLineNo">300</span> beg = stop - 1;<a name="line.300"></a>
<span class="sourceLineNo">301</span> } else {<a name="line.301"></a>
<span class="sourceLineNo">302</span> beg = length - 1;<a name="line.302"></a>
<span class="sourceLineNo">303</span> }<a name="line.303"></a>
<span class="sourceLineNo">304</span> } else {<a name="line.304"></a>
<span class="sourceLineNo">305</span> beg = 0;<a name="line.305"></a>
<span class="sourceLineNo">306</span> }<a name="line.306"></a>
<span class="sourceLineNo">307</span> } else {<a name="line.307"></a>
<span class="sourceLineNo">308</span> beg = start;<a name="line.308"></a>
<span class="sourceLineNo">309</span> }<a name="line.309"></a>
<span class="sourceLineNo">310</span> return beg + step * n;<a name="line.310"></a>
<span class="sourceLineNo">311</span> }<a name="line.311"></a>
<span class="sourceLineNo">312</span><a name="line.312"></a>
<span class="sourceLineNo">313</span> /**<a name="line.313"></a>
<span class="sourceLineNo">314</span> * Set the step size inside of the Slice. If the the wanted step is set to<a name="line.314"></a>
<span class="sourceLineNo">315</span> * {@code null}, it will be set by default to 1.<a name="line.315"></a>
<span class="sourceLineNo">316</span> * <a name="line.316"></a>
<span class="sourceLineNo">317</span> * @param step<a name="line.317"></a>
<span class="sourceLineNo">318</span> * New wanted step, may be {@code null}<a name="line.318"></a>
<span class="sourceLineNo">319</span> */<a name="line.319"></a>
<span class="sourceLineNo">320</span> public void setStep(int step) {<a name="line.320"></a>
<span class="sourceLineNo">321</span> if (step == 0) {<a name="line.321"></a>
<span class="sourceLineNo">322</span> throw new IllegalArgumentException("Step must not be zero");<a name="line.322"></a>
<span class="sourceLineNo">323</span> }<a name="line.323"></a>
<span class="sourceLineNo">324</span> this.step = step;<a name="line.324"></a>
<span class="sourceLineNo">325</span> }<a name="line.325"></a>
<span class="sourceLineNo">326</span><a name="line.326"></a>
<span class="sourceLineNo">327</span> /**<a name="line.327"></a>
<span class="sourceLineNo">328</span> * Returns a String representation of the Slice comparable to the python<a name="line.328"></a>
<span class="sourceLineNo">329</span> * representation.<a name="line.329"></a>
<span class="sourceLineNo">330</span> * <a name="line.330"></a>
<span class="sourceLineNo">331</span> * @param s<a name="line.331"></a>
<span class="sourceLineNo">332</span> * String builder<a name="line.332"></a>
<span class="sourceLineNo">333</span> * @param len<a name="line.333"></a>
<span class="sourceLineNo">334</span> * Maximal length of the Slice, or -1 if not set<a name="line.334"></a>
<span class="sourceLineNo">335</span> * @param beg<a name="line.335"></a>
<span class="sourceLineNo">336</span> * Start index of the Slice<a name="line.336"></a>
<span class="sourceLineNo">337</span> * @param end<a name="line.337"></a>
<span class="sourceLineNo">338</span> * Stop index of the Slice<a name="line.338"></a>
<span class="sourceLineNo">339</span> * @param del<a name="line.339"></a>
<span class="sourceLineNo">340</span> * Step of the Slice<a name="line.340"></a>
<span class="sourceLineNo">341</span> */<a name="line.341"></a>
<span class="sourceLineNo">342</span> public static void appendSliceToString(final StringBuilder s, final int len, final int beg, final int end,<a name="line.342"></a>
<span class="sourceLineNo">343</span> final int del) {<a name="line.343"></a>
<span class="sourceLineNo">344</span> int o = s.length();<a name="line.344"></a>
<span class="sourceLineNo">345</span> if (del &gt; 0) {<a name="line.345"></a>
<span class="sourceLineNo">346</span> if (beg != 0)<a name="line.346"></a>
<span class="sourceLineNo">347</span> s.append(beg);<a name="line.347"></a>
<span class="sourceLineNo">348</span> } else {<a name="line.348"></a>
<span class="sourceLineNo">349</span> if (beg != len - 1)<a name="line.349"></a>
<span class="sourceLineNo">350</span> s.append(beg);<a name="line.350"></a>
<span class="sourceLineNo">351</span> }<a name="line.351"></a>
<span class="sourceLineNo">352</span><a name="line.352"></a>
<span class="sourceLineNo">353</span> int n = getNumSteps(beg, end, del);<a name="line.353"></a>
<span class="sourceLineNo">354</span> if (n == 1) {<a name="line.354"></a>
<span class="sourceLineNo">355</span> if (s.length() == o) {<a name="line.355"></a>
<span class="sourceLineNo">356</span> s.append(beg);<a name="line.356"></a>
<span class="sourceLineNo">357</span> }<a name="line.357"></a>
<span class="sourceLineNo">358</span> return;<a name="line.358"></a>
<span class="sourceLineNo">359</span> }<a name="line.359"></a>
<span class="sourceLineNo">360</span><a name="line.360"></a>
<span class="sourceLineNo">361</span> s.append(':');<a name="line.361"></a>
<span class="sourceLineNo">362</span><a name="line.362"></a>
<span class="sourceLineNo">363</span> if (del &gt; 0) {<a name="line.363"></a>
<span class="sourceLineNo">364</span> if (end != len)<a name="line.364"></a>
<span class="sourceLineNo">365</span> s.append(end);<a name="line.365"></a>
<span class="sourceLineNo">366</span> } else {<a name="line.366"></a>
<span class="sourceLineNo">367</span> if (end != -1)<a name="line.367"></a>
<span class="sourceLineNo">368</span> s.append(end);<a name="line.368"></a>
<span class="sourceLineNo">369</span> }<a name="line.369"></a>
<span class="sourceLineNo">370</span><a name="line.370"></a>
<span class="sourceLineNo">371</span> if (del != 1) {<a name="line.371"></a>
<span class="sourceLineNo">372</span> s.append(':');<a name="line.372"></a>
<span class="sourceLineNo">373</span> s.append(del);<a name="line.373"></a>
<span class="sourceLineNo">374</span> }<a name="line.374"></a>
<span class="sourceLineNo">375</span> }<a name="line.375"></a>
<span class="sourceLineNo">376</span><a name="line.376"></a>
<span class="sourceLineNo">377</span> /**<a name="line.377"></a>
<span class="sourceLineNo">378</span> * Returns a string construction of the slice with the python form.<a name="line.378"></a>
<span class="sourceLineNo">379</span> * <a name="line.379"></a>
<span class="sourceLineNo">380</span> * @return Constructed String.<a name="line.380"></a>
<span class="sourceLineNo">381</span> */<a name="line.381"></a>
<span class="sourceLineNo">382</span> @Override<a name="line.382"></a>
<span class="sourceLineNo">383</span> public String toString() {<a name="line.383"></a>
<span class="sourceLineNo">384</span> StringBuilder s = new StringBuilder();<a name="line.384"></a>
<span class="sourceLineNo">385</span> appendSliceToString(s, length, start != null ? start : (step &gt; 0 ? 0 : length - 1),<a name="line.385"></a>
<span class="sourceLineNo">386</span> stop != null ? stop : (step &gt; 0 ? length : -1), step);<a name="line.386"></a>
<span class="sourceLineNo">387</span> return s.toString();<a name="line.387"></a>
<span class="sourceLineNo">388</span> }<a name="line.388"></a>
<span class="sourceLineNo">389</span><a name="line.389"></a>
<span class="sourceLineNo">390</span> /**<a name="line.390"></a>
<span class="sourceLineNo">391</span> * Returns the number of steps inside of the Slice<a name="line.391"></a>
<span class="sourceLineNo">392</span> * <a name="line.392"></a>
<span class="sourceLineNo">393</span> * @return Number of steps inside of the Slice<a name="line.393"></a>
<span class="sourceLineNo">394</span> */<a name="line.394"></a>
<span class="sourceLineNo">395</span> public int getNumSteps() {<a name="line.395"></a>
<span class="sourceLineNo">396</span> if (length &lt; 0) {<a name="line.396"></a>
<span class="sourceLineNo">397</span> if (stop == null)<a name="line.397"></a>
<span class="sourceLineNo">398</span> throw new IllegalStateException("Slice is underspecified - stop is null and length is negative");<a name="line.398"></a>
<span class="sourceLineNo">399</span> int beg = start == null ? (step &gt; 0 ? 0 : stop - 1) : start;<a name="line.399"></a>
<span class="sourceLineNo">400</span> if (step &gt; 0 &amp;&amp; stop &lt;= beg)<a name="line.400"></a>
<span class="sourceLineNo">401</span> return 0;<a name="line.401"></a>
<span class="sourceLineNo">402</span> if (step &lt; 0 &amp;&amp; stop &gt; beg)<a name="line.402"></a>
<span class="sourceLineNo">403</span> return 0;<a name="line.403"></a>
<span class="sourceLineNo">404</span> return getNumSteps(beg, stop, step);<a name="line.404"></a>
<span class="sourceLineNo">405</span> }<a name="line.405"></a>
<span class="sourceLineNo">406</span> int beg = start == null ? (step &gt; 0 ? 0 : length - 1) : start;<a name="line.406"></a>
<span class="sourceLineNo">407</span> int end = stop == null ? (step &gt; 0 ? length : -1) : stop;<a name="line.407"></a>
<span class="sourceLineNo">408</span> return getNumSteps(beg, end, step);<a name="line.408"></a>
<span class="sourceLineNo">409</span> }<a name="line.409"></a>
<span class="sourceLineNo">410</span><a name="line.410"></a>
<span class="sourceLineNo">411</span> /**<a name="line.411"></a>
<span class="sourceLineNo">412</span> * Returns the number of steps inside of the Slice from a point to an other<a name="line.412"></a>
<span class="sourceLineNo">413</span> * point minus 1 because this is an exclusive index<a name="line.413"></a>
<span class="sourceLineNo">414</span> * <a name="line.414"></a>
<span class="sourceLineNo">415</span> * @param beg<a name="line.415"></a>
<span class="sourceLineNo">416</span> * Starting point<a name="line.416"></a>
<span class="sourceLineNo">417</span> * @param end<a name="line.417"></a>
<span class="sourceLineNo">418</span> * (exclusive) Stopping point<a name="line.418"></a>
<span class="sourceLineNo">419</span> * @return Numbers of steps between the 2 limits.<a name="line.419"></a>
<span class="sourceLineNo">420</span> */<a name="line.420"></a>
<span class="sourceLineNo">421</span> public int getNumSteps(int beg, int end) {<a name="line.421"></a>
<span class="sourceLineNo">422</span> return getNumSteps(beg, end, step);<a name="line.422"></a>
<span class="sourceLineNo">423</span> }<a name="line.423"></a>
<span class="sourceLineNo">424</span><a name="line.424"></a>
<span class="sourceLineNo">425</span> private static int getNumSteps(int beg, int end, int step) {<a name="line.425"></a>
<span class="sourceLineNo">426</span> int del = step &gt; 0 ? 1 : -1;<a name="line.426"></a>
<span class="sourceLineNo">427</span> return Math.max(0, (end - beg - del) / step + 1);<a name="line.427"></a>
<span class="sourceLineNo">428</span> }<a name="line.428"></a>
<span class="sourceLineNo">429</span><a name="line.429"></a>
<span class="sourceLineNo">430</span> /**<a name="line.430"></a>
<span class="sourceLineNo">431</span> * Returns the last value inside of Slice.<a name="line.431"></a>
<span class="sourceLineNo">432</span> * <a name="line.432"></a>
<span class="sourceLineNo">433</span> * @return Last value in the slice, it can be a lower value than the start<a name="line.433"></a>
<span class="sourceLineNo">434</span> * if the step is going backward<a name="line.434"></a>
<span class="sourceLineNo">435</span> */<a name="line.435"></a>
<span class="sourceLineNo">436</span> public int getEnd() {<a name="line.436"></a>
<span class="sourceLineNo">437</span> int n = getNumSteps() - 1;<a name="line.437"></a>
<span class="sourceLineNo">438</span> if (n &lt; 0)<a name="line.438"></a>
<span class="sourceLineNo">439</span> throw new IllegalStateException("End is not defined");<a name="line.439"></a>
<span class="sourceLineNo">440</span><a name="line.440"></a>
<span class="sourceLineNo">441</span> return getPosition(n);<a name="line.441"></a>
<span class="sourceLineNo">442</span> }<a name="line.442"></a>
<span class="sourceLineNo">443</span><a name="line.443"></a>
<span class="sourceLineNo">444</span> /**<a name="line.444"></a>
<span class="sourceLineNo">445</span> * Flips the Slice direction, after this operation, the slice begins at<a name="line.445"></a>
<span class="sourceLineNo">446</span> * previous end point, steps in the opposite direction, and finishes at the<a name="line.446"></a>
<span class="sourceLineNo">447</span> * previous start point.<a name="line.447"></a>
<span class="sourceLineNo">448</span> * &lt;p&gt;<a name="line.448"></a>
<span class="sourceLineNo">449</span> * Note : the stop value may not be preserved across two flips<a name="line.449"></a>
<span class="sourceLineNo">450</span> * &lt;/p&gt;<a name="line.450"></a>
<span class="sourceLineNo">451</span> * <a name="line.451"></a>
<span class="sourceLineNo">452</span> * @return Flipped Slice.<a name="line.452"></a>
<span class="sourceLineNo">453</span> */<a name="line.453"></a>
<span class="sourceLineNo">454</span> public Slice flip() {<a name="line.454"></a>
<span class="sourceLineNo">455</span> if (length &lt; 0) {<a name="line.455"></a>
<span class="sourceLineNo">456</span> Integer tmp = start == null ? null : start - step;<a name="line.456"></a>
<span class="sourceLineNo">457</span> start = stop == null ? null : getEnd();<a name="line.457"></a>
<span class="sourceLineNo">458</span> stop = tmp;<a name="line.458"></a>
<span class="sourceLineNo">459</span> } else {<a name="line.459"></a>
<span class="sourceLineNo">460</span> Integer tstart = start;<a name="line.460"></a>
<span class="sourceLineNo">461</span> start = stop == null ? null : getEnd();<a name="line.461"></a>
<span class="sourceLineNo">462</span> stop = tstart == null ? null : tstart - step;<a name="line.462"></a>
<span class="sourceLineNo">463</span> }<a name="line.463"></a>
<span class="sourceLineNo">464</span> step = -step;<a name="line.464"></a>
<span class="sourceLineNo">465</span><a name="line.465"></a>
<span class="sourceLineNo">466</span> return this;<a name="line.466"></a>
<span class="sourceLineNo">467</span> }<a name="line.467"></a>
<span class="sourceLineNo">468</span><a name="line.468"></a>
<span class="sourceLineNo">469</span> /**<a name="line.469"></a>
<span class="sourceLineNo">470</span> * Populates given start, stop, step arrays from given slice array<a name="line.470"></a>
<span class="sourceLineNo">471</span> * <a name="line.471"></a>
<span class="sourceLineNo">472</span> * @param slice<a name="line.472"></a>
<span class="sourceLineNo">473</span> * Input array of Slices wanted to convert<a name="line.473"></a>
<span class="sourceLineNo">474</span> * @param shape<a name="line.474"></a>
<span class="sourceLineNo">475</span> * Input array of Slices shapes<a name="line.475"></a>
<span class="sourceLineNo">476</span> * @param start<a name="line.476"></a>
<span class="sourceLineNo">477</span> * Output array of Slices starts<a name="line.477"></a>
<span class="sourceLineNo">478</span> * @param stop<a name="line.478"></a>
<span class="sourceLineNo">479</span> * Output array of Slices stops<a name="line.479"></a>
<span class="sourceLineNo">480</span> * @param step<a name="line.480"></a>
<span class="sourceLineNo">481</span> * Output array of Slices steps<a name="line.481"></a>
<span class="sourceLineNo">482</span> */<a name="line.482"></a>
<span class="sourceLineNo">483</span> public static void convertFromSlice(final Slice[] slice, final int[] shape, final int[] start, final int[] stop,<a name="line.483"></a>
<span class="sourceLineNo">484</span> final int[] step) {<a name="line.484"></a>
<span class="sourceLineNo">485</span> final int rank = shape.length;<a name="line.485"></a>
<span class="sourceLineNo">486</span> final int length = slice == null ? 0 : slice.length;<a name="line.486"></a>
<span class="sourceLineNo">487</span><a name="line.487"></a>
<span class="sourceLineNo">488</span> int i = 0;<a name="line.488"></a>
<span class="sourceLineNo">489</span> for (; i &lt; length; i++) {<a name="line.489"></a>
<span class="sourceLineNo">490</span> if (length &gt; rank)<a name="line.490"></a>
<span class="sourceLineNo">491</span> break;<a name="line.491"></a>
<span class="sourceLineNo">492</span><a name="line.492"></a>
<span class="sourceLineNo">493</span> Slice s = slice[i];<a name="line.493"></a>
<span class="sourceLineNo">494</span> if (s == null) {<a name="line.494"></a>
<span class="sourceLineNo">495</span> start[i] = 0;<a name="line.495"></a>
<span class="sourceLineNo">496</span> stop[i] = shape[i];<a name="line.496"></a>
<span class="sourceLineNo">497</span> step[i] = 1;<a name="line.497"></a>
<span class="sourceLineNo">498</span> continue;<a name="line.498"></a>
<span class="sourceLineNo">499</span> }<a name="line.499"></a>
<span class="sourceLineNo">500</span> int n;<a name="line.500"></a>
<span class="sourceLineNo">501</span> if (s.start == null) {<a name="line.501"></a>
<span class="sourceLineNo">502</span> start[i] = s.step &gt; 0 ? 0 : shape[i] - 1;<a name="line.502"></a>
<span class="sourceLineNo">503</span> } else {<a name="line.503"></a>
<span class="sourceLineNo">504</span> n = s.start;<a name="line.504"></a>
<span class="sourceLineNo">505</span> if (n &lt; 0)<a name="line.505"></a>
<span class="sourceLineNo">506</span> n += shape[i];<a name="line.506"></a>
<span class="sourceLineNo">507</span> if (n &lt; 0 || n &gt;= shape[i]) {<a name="line.507"></a>
<span class="sourceLineNo">508</span> throw new IllegalArgumentException(<a name="line.508"></a>
<span class="sourceLineNo">509</span> String.format("Start is out of bounds: %d is not in [%d,%d)", n, s.start, shape[i]));<a name="line.509"></a>
<span class="sourceLineNo">510</span> }<a name="line.510"></a>
<span class="sourceLineNo">511</span> start[i] = n;<a name="line.511"></a>
<span class="sourceLineNo">512</span> }<a name="line.512"></a>
<span class="sourceLineNo">513</span><a name="line.513"></a>
<span class="sourceLineNo">514</span> if (s.stop == null) {<a name="line.514"></a>
<span class="sourceLineNo">515</span> stop[i] = s.step &gt; 0 ? shape[i] : -1;<a name="line.515"></a>
<span class="sourceLineNo">516</span> } else {<a name="line.516"></a>
<span class="sourceLineNo">517</span> n = s.stop;<a name="line.517"></a>
<span class="sourceLineNo">518</span> if (n &lt; 0)<a name="line.518"></a>
<span class="sourceLineNo">519</span> n += shape[i];<a name="line.519"></a>
<span class="sourceLineNo">520</span> if (n &lt; 0 || n &gt; shape[i]) {<a name="line.520"></a>
<span class="sourceLineNo">521</span> throw new IllegalArgumentException(<a name="line.521"></a>
<span class="sourceLineNo">522</span> String.format("Stop is out of bounds: %d is not in [%d,%d)", n, s.stop, shape[i]));<a name="line.522"></a>
<span class="sourceLineNo">523</span> }<a name="line.523"></a>
<span class="sourceLineNo">524</span> stop[i] = n;<a name="line.524"></a>
<span class="sourceLineNo">525</span> }<a name="line.525"></a>
<span class="sourceLineNo">526</span><a name="line.526"></a>
<span class="sourceLineNo">527</span> n = s.step;<a name="line.527"></a>
<span class="sourceLineNo">528</span> if (n == 0) {<a name="line.528"></a>
<span class="sourceLineNo">529</span> throw new IllegalArgumentException("Step cannot be zero");<a name="line.529"></a>
<span class="sourceLineNo">530</span> }<a name="line.530"></a>
<span class="sourceLineNo">531</span> if (n &gt; 0) {<a name="line.531"></a>
<span class="sourceLineNo">532</span> if (start[i] &gt; stop[i])<a name="line.532"></a>
<span class="sourceLineNo">533</span> throw new IllegalArgumentException("Start must be less than stop for positive steps");<a name="line.533"></a>
<span class="sourceLineNo">534</span> } else {<a name="line.534"></a>
<span class="sourceLineNo">535</span> if (start[i] &lt; stop[i])<a name="line.535"></a>
<span class="sourceLineNo">536</span> throw new IllegalArgumentException("Start must be greater than stop for negative steps");<a name="line.536"></a>
<span class="sourceLineNo">537</span> }<a name="line.537"></a>
<span class="sourceLineNo">538</span> step[i] = n;<a name="line.538"></a>
<span class="sourceLineNo">539</span> }<a name="line.539"></a>
<span class="sourceLineNo">540</span> for (; i &lt; rank; i++) {<a name="line.540"></a>
<span class="sourceLineNo">541</span> start[i] = 0;<a name="line.541"></a>
<span class="sourceLineNo">542</span> stop[i] = shape[i];<a name="line.542"></a>
<span class="sourceLineNo">543</span> step[i] = 1;<a name="line.543"></a>
<span class="sourceLineNo">544</span> }<a name="line.544"></a>
<span class="sourceLineNo">545</span> }<a name="line.545"></a>
<span class="sourceLineNo">546</span><a name="line.546"></a>
<span class="sourceLineNo">547</span> /**<a name="line.547"></a>
<span class="sourceLineNo">548</span> * Converts a set of integer arrays in a slice array<a name="line.548"></a>
<span class="sourceLineNo">549</span> * <a name="line.549"></a>
<span class="sourceLineNo">550</span> * @param start<a name="line.550"></a>
<span class="sourceLineNo">551</span> * Array of Slices starts<a name="line.551"></a>
<span class="sourceLineNo">552</span> * @param stop<a name="line.552"></a>
<span class="sourceLineNo">553</span> * Array of Slices stops<a name="line.553"></a>
<span class="sourceLineNo">554</span> * @param step<a name="line.554"></a>
<span class="sourceLineNo">555</span> * Array of Slices steps<a name="line.555"></a>
<span class="sourceLineNo">556</span> * @return Slice array corresponding to the starts, stops and steps arrays<a name="line.556"></a>
<span class="sourceLineNo">557</span> * entered.<a name="line.557"></a>
<span class="sourceLineNo">558</span> */<a name="line.558"></a>
<span class="sourceLineNo">559</span> public static Slice[] convertToSlice(final int[] start, final int[] stop, final int[] step) {<a name="line.559"></a>
<span class="sourceLineNo">560</span> int orank = start.length;<a name="line.560"></a>
<span class="sourceLineNo">561</span><a name="line.561"></a>
<span class="sourceLineNo">562</span> if (stop.length != orank || step.length != orank) {<a name="line.562"></a>
<span class="sourceLineNo">563</span> throw new IllegalArgumentException("All arrays must be same length");<a name="line.563"></a>
<span class="sourceLineNo">564</span> }<a name="line.564"></a>
<span class="sourceLineNo">565</span><a name="line.565"></a>
<span class="sourceLineNo">566</span> Slice[] slice = new Slice[orank];<a name="line.566"></a>
<span class="sourceLineNo">567</span><a name="line.567"></a>
<span class="sourceLineNo">568</span> for (int j = 0; j &lt; orank; j++) {<a name="line.568"></a>
<span class="sourceLineNo">569</span> slice[j] = new Slice(start[j], stop[j], step[j]);<a name="line.569"></a>
<span class="sourceLineNo">570</span> }<a name="line.570"></a>
<span class="sourceLineNo">571</span><a name="line.571"></a>
<span class="sourceLineNo">572</span> return slice;<a name="line.572"></a>
<span class="sourceLineNo">573</span> }<a name="line.573"></a>
<span class="sourceLineNo">574</span><a name="line.574"></a>
<span class="sourceLineNo">575</span> /**<a name="line.575"></a>
<span class="sourceLineNo">576</span> * Converts string in a Slice array<a name="line.576"></a>
<span class="sourceLineNo">577</span> * <a name="line.577"></a>
<span class="sourceLineNo">578</span> * @param sliceString<a name="line.578"></a>
<span class="sourceLineNo">579</span> * String of the Slice array<a name="line.579"></a>
<span class="sourceLineNo">580</span> * @return Slice array created from the given string<a name="line.580"></a>
<span class="sourceLineNo">581</span> */<a name="line.581"></a>
<span class="sourceLineNo">582</span> public static Slice[] convertFromString(String sliceString) {<a name="line.582"></a>
<span class="sourceLineNo">583</span><a name="line.583"></a>
<span class="sourceLineNo">584</span> String clean = sliceString.replace("[", "");<a name="line.584"></a>
<span class="sourceLineNo">585</span> clean = clean.replace("]", "");<a name="line.585"></a>
<span class="sourceLineNo">586</span><a name="line.586"></a>
<span class="sourceLineNo">587</span> String[] sub = clean.split(",");<a name="line.587"></a>
<span class="sourceLineNo">588</span><a name="line.588"></a>
<span class="sourceLineNo">589</span> Slice[] slices = new Slice[sub.length];<a name="line.589"></a>
<span class="sourceLineNo">590</span><a name="line.590"></a>
<span class="sourceLineNo">591</span> for (int i = 0; i &lt; sub.length; i++) {<a name="line.591"></a>
<span class="sourceLineNo">592</span> String s = sub[i];<a name="line.592"></a>
<span class="sourceLineNo">593</span><a name="line.593"></a>
<span class="sourceLineNo">594</span> Slice slice = new Slice();<a name="line.594"></a>
<span class="sourceLineNo">595</span> slices[i] = slice;<a name="line.595"></a>
<span class="sourceLineNo">596</span><a name="line.596"></a>
<span class="sourceLineNo">597</span> int idx0 = s.indexOf(":");<a name="line.597"></a>
<span class="sourceLineNo">598</span><a name="line.598"></a>
<span class="sourceLineNo">599</span> int n = 0;<a name="line.599"></a>
<span class="sourceLineNo">600</span> if (idx0 == -1) {<a name="line.600"></a>
<span class="sourceLineNo">601</span> n = Integer.parseInt(s);<a name="line.601"></a>
<span class="sourceLineNo">602</span> slice.setStart(n);<a name="line.602"></a>
<span class="sourceLineNo">603</span> slice.setStop(n + 1);<a name="line.603"></a>
<span class="sourceLineNo">604</span> continue;<a name="line.604"></a>
<span class="sourceLineNo">605</span> } else if (idx0 != 0) {<a name="line.605"></a>
<span class="sourceLineNo">606</span> n = Integer.parseInt(s.substring(0, idx0));<a name="line.606"></a>
<span class="sourceLineNo">607</span> }<a name="line.607"></a>
<span class="sourceLineNo">608</span> slice.setStart(n);<a name="line.608"></a>
<span class="sourceLineNo">609</span><a name="line.609"></a>
<span class="sourceLineNo">610</span> idx0++;<a name="line.610"></a>
<span class="sourceLineNo">611</span> int idx1 = s.indexOf(":", idx0);<a name="line.611"></a>
<span class="sourceLineNo">612</span> if (idx1 == -1) {<a name="line.612"></a>
<span class="sourceLineNo">613</span> String t = s.substring(idx0).trim();<a name="line.613"></a>
<span class="sourceLineNo">614</span> if (t.length() == 0)<a name="line.614"></a>
<span class="sourceLineNo">615</span> continue;<a name="line.615"></a>
<span class="sourceLineNo">616</span><a name="line.616"></a>
<span class="sourceLineNo">617</span> slice.setStop(Integer.parseInt(t));<a name="line.617"></a>
<span class="sourceLineNo">618</span> continue;<a name="line.618"></a>
<span class="sourceLineNo">619</span> } else if (idx1 != idx0) {<a name="line.619"></a>
<span class="sourceLineNo">620</span> slice.setStop(Integer.parseInt(s.substring(idx0, idx1)));<a name="line.620"></a>
<span class="sourceLineNo">621</span> }<a name="line.621"></a>
<span class="sourceLineNo">622</span><a name="line.622"></a>
<span class="sourceLineNo">623</span> String t = s.substring(idx1 + 1).trim();<a name="line.623"></a>
<span class="sourceLineNo">624</span> if (t.length() &gt; 0)<a name="line.624"></a>
<span class="sourceLineNo">625</span> slice.setStep(Integer.parseInt(t));<a name="line.625"></a>
<span class="sourceLineNo">626</span> }<a name="line.626"></a>
<span class="sourceLineNo">627</span><a name="line.627"></a>
<span class="sourceLineNo">628</span> return slices;<a name="line.628"></a>
<span class="sourceLineNo">629</span> }<a name="line.629"></a>
<span class="sourceLineNo">630</span><a name="line.630"></a>
<span class="sourceLineNo">631</span> /**<a name="line.631"></a>
<span class="sourceLineNo">632</span> * Creates a string representing the slice taken from given shape<a name="line.632"></a>
<span class="sourceLineNo">633</span> * <a name="line.633"></a>
<span class="sourceLineNo">634</span> * @param shape<a name="line.634"></a>
<span class="sourceLineNo">635</span> * Array of Slices shapes<a name="line.635"></a>
<span class="sourceLineNo">636</span> * @param start<a name="line.636"></a>
<span class="sourceLineNo">637</span> * Array of Slices starts<a name="line.637"></a>
<span class="sourceLineNo">638</span> * @param stop<a name="line.638"></a>
<span class="sourceLineNo">639</span> * Array of Slices stops<a name="line.639"></a>
<span class="sourceLineNo">640</span> * @param step<a name="line.640"></a>
<span class="sourceLineNo">641</span> * Array of Slices steps<a name="line.641"></a>
<span class="sourceLineNo">642</span> * @return String representation of the Slice<a name="line.642"></a>
<span class="sourceLineNo">643</span> */<a name="line.643"></a>
<span class="sourceLineNo">644</span> public static String createString(final int[] shape, final int[] start, final int[] stop, final int[] step) {<a name="line.644"></a>
<span class="sourceLineNo">645</span> final int rank = shape.length;<a name="line.645"></a>
<span class="sourceLineNo">646</span> if (rank == 0) {<a name="line.646"></a>
<span class="sourceLineNo">647</span> return "";<a name="line.647"></a>
<span class="sourceLineNo">648</span> }<a name="line.648"></a>
<span class="sourceLineNo">649</span> StringBuilder s = new StringBuilder();<a name="line.649"></a>
<span class="sourceLineNo">650</span> for (int i = 0; i &lt; rank; i++) {<a name="line.650"></a>
<span class="sourceLineNo">651</span> int l = shape[i];<a name="line.651"></a>
<span class="sourceLineNo">652</span> int d = step == null ? 1 : step[i];<a name="line.652"></a>
<span class="sourceLineNo">653</span> int b = start == null ? (d &gt; 0 ? 0 : l - 1) : start[i];<a name="line.653"></a>
<span class="sourceLineNo">654</span> int e = stop == null ? (d &gt; 0 ? l : -1) : stop[i];<a name="line.654"></a>
<span class="sourceLineNo">655</span><a name="line.655"></a>
<span class="sourceLineNo">656</span> appendSliceToString(s, l, b, e, d);<a name="line.656"></a>
<span class="sourceLineNo">657</span> s.append(',');<a name="line.657"></a>
<span class="sourceLineNo">658</span> }<a name="line.658"></a>
<span class="sourceLineNo">659</span><a name="line.659"></a>
<span class="sourceLineNo">660</span> return s.substring(0, s.length() - 1);<a name="line.660"></a>
<span class="sourceLineNo">661</span> }<a name="line.661"></a>
<span class="sourceLineNo">662</span><a name="line.662"></a>
<span class="sourceLineNo">663</span> /**<a name="line.663"></a>
<span class="sourceLineNo">664</span> * Creates a string representation of slices.<a name="line.664"></a>
<span class="sourceLineNo">665</span> * <a name="line.665"></a>
<span class="sourceLineNo">666</span> * @param slices<a name="line.666"></a>
<span class="sourceLineNo">667</span> * Wanted Slices to put inside of the string representation<a name="line.667"></a>
<span class="sourceLineNo">668</span> * @return Return the string representation of the Slices entered.<a name="line.668"></a>
<span class="sourceLineNo">669</span> */<a name="line.669"></a>
<span class="sourceLineNo">670</span> public static String createString(Slice... slices) {<a name="line.670"></a>
<span class="sourceLineNo">671</span> if (slices == null || slices.length == 0) {<a name="line.671"></a>
<span class="sourceLineNo">672</span> return "";<a name="line.672"></a>
<span class="sourceLineNo">673</span> }<a name="line.673"></a>
<span class="sourceLineNo">674</span><a name="line.674"></a>
<span class="sourceLineNo">675</span> StringBuilder t = new StringBuilder();<a name="line.675"></a>
<span class="sourceLineNo">676</span> for (Slice s : slices) {<a name="line.676"></a>
<span class="sourceLineNo">677</span> t.append(s != null ? s.toString() : ':');<a name="line.677"></a>
<span class="sourceLineNo">678</span> t.append(',');<a name="line.678"></a>
<span class="sourceLineNo">679</span> }<a name="line.679"></a>
<span class="sourceLineNo">680</span><a name="line.680"></a>
<span class="sourceLineNo">681</span> return t.substring(0, t.length() - 1);<a name="line.681"></a>
<span class="sourceLineNo">682</span> }<a name="line.682"></a>
<span class="sourceLineNo">683</span>}<a name="line.683"></a>
</pre>
</div>
</body>
</html>