# Copyright 2005-2018 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
# 
# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
#

unsigned [2] N2 : dump;
unsigned [2] codedNumberOfFirstOrderPackedValues : no_copy ;
unsigned [2] numberOfSecondOrderPackedValues : dump;

# used to extend
unsigned [1] extraValues=0 : hidden, edition_specific;

meta numberOfGroups evaluate(codedNumberOfFirstOrderPackedValues + 65536 * extraValues);

unsigned[1] groupWidths[numberOfGroups] :dump;
meta bitsPerValue second_order_bits_per_value(values,binaryScaleFactor,decimalScaleFactor);

position offsetBeforeData;

if(bitmapPresent)   {
   meta codedValues data_g1second_order_row_by_row_packing(
	#simple_packing args
     section4Length,
     offsetBeforeData,
     offsetSection4,
     unitsFactor,
     unitsBias,
     changingPrecision,
     numberOfCodedValues,
     bitsPerValue,
     referenceValue,
     binaryScaleFactor,
     decimalScaleFactor,
     optimizeScaleFactor,
	#g1second_order_row_by_row args
	 halfByte,
	 packingType,
	 grid_ieee,
	 precision,
	 widthOfFirstOrderValues,
	 N1,
	 N2,
	 numberOfGroups,
	 numberOfSecondOrderPackedValues,
	 extraValues,
	 Ni,
	 Nj,
	 pl,
	 jPointsAreConsecutive,
	 groupWidths,
	 bitmap

   ): read_only;
   alias data.packedValues = codedValues; 

   meta values data_apply_bitmap(codedValues,bitmap,missingValue,binaryScaleFactor) : dump;
} else {

   meta values data_g1second_order_row_by_row_packing(
	#simple_packing args
     section4Length,
     offsetBeforeData,
     offsetSection4,
     unitsFactor,
     unitsBias,
     changingPrecision,
     numberOfCodedValues,
     bitsPerValue,
     referenceValue,
     binaryScaleFactor,
     decimalScaleFactor,
     optimizeScaleFactor,
	#g1second_order_row_by_row args
	 halfByte,
	 packingType,
	 grid_ieee,
	 precision,
	 widthOfFirstOrderValues,
	 N1,
	 N2,
	 numberOfGroups,
	 numberOfSecondOrderPackedValues,
	 extraValues,
	 Ni,
	 Nj,
	 pl,
	 jPointsAreConsecutive,
	 groupWidths

   ) : dump;
   alias data.packedValues = values;
}

transient numberOfCodedValues = numberOfSecondOrderPackedValues;

meta packingError simple_packing_error(bitsPerValue,binaryScaleFactor,decimalScaleFactor,referenceValue,ibm) : no_copy;

template statistics "common/statistics_grid.def";
