| // Copyright 2015 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| //go:build ignore | |
| package main | |
| import ( | |
| "time" | |
| "golang.org/x/text/language" | |
| ) | |
| // This file contains code common to gen.go and the package code. | |
| const ( | |
| cashShift = 3 | |
| roundMask = 0x7 | |
| nonTenderBit = 0x8000 | |
| ) | |
| // currencyInfo contains information about a currency. | |
| // bits 0..2: index into roundings for standard rounding | |
| // bits 3..5: index into roundings for cash rounding | |
| type currencyInfo byte | |
| // roundingType defines the scale (number of fractional decimals) and increments | |
| // in terms of units of size 10^-scale. For example, for scale == 2 and | |
| // increment == 1, the currency is rounded to units of 0.01. | |
| type roundingType struct { | |
| scale, increment uint8 | |
| } | |
| // roundings contains rounding data for currencies. This struct is | |
| // created by hand as it is very unlikely to change much. | |
| var roundings = [...]roundingType{ | |
| {2, 1}, // default | |
| {0, 1}, | |
| {1, 1}, | |
| {3, 1}, | |
| {4, 1}, | |
| {2, 5}, // cash rounding alternative | |
| {2, 50}, | |
| } | |
| // regionToCode returns a 16-bit region code. Only two-letter codes are | |
| // supported. (Three-letter codes are not needed.) | |
| func regionToCode(r language.Region) uint16 { | |
| if s := r.String(); len(s) == 2 { | |
| return uint16(s[0])<<8 | uint16(s[1]) | |
| } | |
| return 0 | |
| } | |
| func toDate(t time.Time) uint32 { | |
| y := t.Year() | |
| if y == 1 { | |
| return 0 | |
| } | |
| date := uint32(y) << 4 | |
| date |= uint32(t.Month()) | |
| date <<= 5 | |
| date |= uint32(t.Day()) | |
| return date | |
| } | |
| func fromDate(date uint32) time.Time { | |
| return time.Date(int(date>>9), time.Month((date>>5)&0xf), int(date&0x1f), 0, 0, 0, 0, time.UTC) | |
| } |