View Javadoc
1   package nom.tam.fits.compression.provider.param.base;
2   
3   /*-
4    * #%L
5    * nom.tam FITS library
6    * %%
7    * Copyright (C) 1996 - 2024 nom-tam-fits
8    * %%
9    * This is free and unencumbered software released into the public domain.
10   *
11   * Anyone is free to copy, modify, publish, use, compile, sell, or
12   * distribute this software, either in source code form or as a compiled
13   * binary, for any purpose, commercial or non-commercial, and by any
14   * means.
15   *
16   * In jurisdictions that recognize copyright laws, the author or authors
17   * of this software dedicate any and all copyright interest in the
18   * software to the public domain. We make this dedication for the benefit
19   * of the public at large and to the detriment of our heirs and
20   * successors. We intend this dedication to be an overt act of
21   * relinquishment in perpetuity of all present and future rights to this
22   * software under copyright law.
23   *
24   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
27   * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
28   * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
29   * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
30   * OTHER DEALINGS IN THE SOFTWARE.
31   * #L%
32   */
33  
34  import java.util.ArrayList;
35  
36  import nom.tam.fits.compression.algorithm.api.ICompressOption;
37  import nom.tam.fits.compression.provider.param.api.ICompressColumnParameter;
38  import nom.tam.fits.compression.provider.param.api.ICompressHeaderParameter;
39  import nom.tam.fits.compression.provider.param.api.ICompressParameters;
40  
41  /**
42   * (<i>for internal use</i>) Compression parameters that are bundled together from distinct sets of component
43   * parameters. For example, some tiled image compression methods will take parameters that consist of those specifically
44   * for the compression algorithm (e.g. Rice vs HCompress) and a set of common parameters for the quantization
45   * (floating-point to integer conversion). This class helps manage such composite parameter sets. The bundle behaves as
46   * it it were a single set of all parameters across all its components.
47   *
48   * @author Attila Kovacs
49   *
50   * @since  1.18
51   */
52  public class BundledParameters extends CompressParameters {
53  
54      private ArrayList<ICompressParameters> bundle;
55  
56      /**
57       * Creates a new set of bundled compression parameters from the specified separate parameter components.
58       *
59       * @param components The components, which are to be bundled to provide a single set of parameters that span all of
60       *                       them.
61       *
62       * @see              #get(int)
63       */
64      public BundledParameters(ICompressParameters... components) {
65          bundle = new ArrayList<>();
66          for (ICompressParameters p : components) {
67              if (p != null) {
68                  bundle.add(p);
69              }
70          }
71      }
72  
73      /**
74       * Returns the number of independent compression parameter components represented by this bundle.
75       *
76       * @return the number of component compression parameter sets in this bundle.
77       *
78       * @see    #get(int)
79       */
80      public int size() {
81          return bundle.size();
82      }
83  
84      /**
85       * Resturn the compression parameters for the specified component index.
86       *
87       * @param  index                     the index of the paramete set in the bundle.
88       *
89       * @return                           the compression parameters for the particular bundle component.
90       *
91       * @throws IndexOutOfBoundsException if the index it negative or beyond the index of the last component.
92       *
93       * @see                              #size()
94       */
95      public ICompressParameters get(int index) {
96          return bundle.get(index);
97      }
98  
99      @Override
100     public BundledParameters copy(ICompressOption option) {
101         throw new UnsupportedOperationException("Cannot copy parameter bundle");
102     }
103 
104     @Override
105     protected ICompressColumnParameter[] columnParameters() {
106         ArrayList<ICompressColumnParameter> list = new ArrayList<>();
107 
108         for (ICompressParameters parms : bundle) {
109             for (ICompressColumnParameter p : ((CompressParameters) parms).columnParameters()) {
110                 list.add(p);
111             }
112         }
113 
114         ICompressColumnParameter[] array = new ICompressColumnParameter[list.size()];
115         return list.toArray(array);
116     }
117 
118     @Override
119     protected ICompressHeaderParameter[] headerParameters() {
120         ArrayList<ICompressHeaderParameter> list = new ArrayList<>();
121         for (ICompressParameters parms : bundle) {
122             for (ICompressHeaderParameter p : ((CompressParameters) parms).headerParameters()) {
123                 list.add(p);
124             }
125         }
126 
127         ICompressHeaderParameter[] array = new ICompressHeaderParameter[list.size()];
128         return list.toArray(array);
129     }
130 
131     @Override
132     public void setTileIndex(int index) {
133         for (ICompressParameters parms : bundle) {
134             parms.setTileIndex(index);
135         }
136     }
137 }