//===--- UnicodeExtendedGraphemeClusters.cpp.gyb ----------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

#include "swift/Runtime/Config.h"

%{

# FIXME: this table should be moved to a Swift file in stdlib.  Unfortunately,
# in Swift we don't have a way to statically initialize arrays.

from GYBUnicodeDataUtils import GraphemeClusterBreakPropertyTable, UnicodeTrieGenerator, get_extended_grapheme_cluster_rules_matrix

grapheme_cluster_break_property_table = \
    GraphemeClusterBreakPropertyTable(unicodeGraphemeBreakPropertyFile)

trie_generator = UnicodeTrieGenerator()
trie_generator.create_tables()
trie_generator.fill_from_unicode_property(grapheme_cluster_break_property_table)
trie_generator.verify(grapheme_cluster_break_property_table)

}%

/// Before compression:
/// bmp_lookup:   ${len(trie_generator.bmp_lookup)}
/// bmp_data:     ${len(trie_generator.bmp_data)} x ${len(trie_generator.bmp_data[0])}
/// supp_lookup1: ${len(trie_generator.supp_lookup1)}
/// supp_lookup2: ${len(trie_generator.supp_lookup2)} x ${len(trie_generator.supp_lookup2[0])}
/// supp_data:    ${len(trie_generator.supp_data)} x ${len(trie_generator.supp_data[0])}

%{

trie_generator.freeze()
trie_generator.verify(grapheme_cluster_break_property_table)

}%

/// After compression:
/// bmp_lookup:   ${len(trie_generator.bmp_lookup)}
/// bmp_data:     ${len(trie_generator.bmp_data)} x ${len(trie_generator.bmp_data[0])}
/// supp_lookup1: ${len(trie_generator.supp_lookup1)}
/// supp_lookup2: ${len(trie_generator.supp_lookup2)} x ${len(trie_generator.supp_lookup2[0])}
/// supp_data:    ${len(trie_generator.supp_data)} x ${len(trie_generator.supp_data[0])}

%{

trie_generator.serialize(grapheme_cluster_break_property_table)

}%

#include <stdint.h>

static const uint8_t _swift_stdlib_GraphemeClusterBreakPropertyTrieImpl[] = {
% for byte in trie_generator.trie_bytes:
  ${byte},
% end
};

SWIFT_RUNTIME_STDLIB_INTERFACE
const uint8_t *_swift_stdlib_GraphemeClusterBreakPropertyTrie =
    _swift_stdlib_GraphemeClusterBreakPropertyTrieImpl;

struct _swift_stdlib_GraphemeClusterBreakPropertyTrieMetadataTy {
  unsigned BMPFirstLevelIndexBits;
  unsigned BMPDataOffsetBits;
  unsigned SuppFirstLevelIndexBits;
  unsigned SuppSecondLevelIndexBits;
  unsigned SuppDataOffsetBits;

  unsigned BMPLookupBytesPerEntry;
  unsigned BMPDataBytesPerEntry;
  unsigned SuppLookup1BytesPerEntry;
  unsigned SuppLookup2BytesPerEntry;
  unsigned SuppDataBytesPerEntry;

  unsigned TrieSize;

  unsigned BMPLookupBytesOffset;
  unsigned BMPDataBytesOffset;
  unsigned SuppLookup1BytesOffset;
  unsigned SuppLookup2BytesOffset;
  unsigned SuppDataBytesOffset;
};

SWIFT_RUNTIME_STDLIB_INTERFACE
const struct _swift_stdlib_GraphemeClusterBreakPropertyTrieMetadataTy
_swift_stdlib_GraphemeClusterBreakPropertyTrieMetadata = {
  ${trie_generator.bmp_first_level_index_bits},
  ${trie_generator.bmp_data_offset_bits},
  ${trie_generator.supp_first_level_index_bits},
  ${trie_generator.supp_second_level_index_bits},
  ${trie_generator.supp_data_offset_bits},

  ${trie_generator.bmp_lookup_bytes_per_entry},
  ${trie_generator.bmp_data_bytes_per_entry},
  ${trie_generator.supp_lookup1_bytes_per_entry},
  ${trie_generator.supp_lookup2_bytes_per_entry},
  ${trie_generator.supp_data_bytes_per_entry},

  ${len(trie_generator.trie_bytes)},

  ${trie_generator.bmp_lookup_bytes_offset},
  ${trie_generator.bmp_data_bytes_offset},
  ${trie_generator.supp_lookup1_bytes_offset},
  ${trie_generator.supp_lookup2_bytes_offset},
  ${trie_generator.supp_data_bytes_offset},
};

%{

extended_grapheme_cluster_rules_matrix = \
    get_extended_grapheme_cluster_rules_matrix(grapheme_cluster_break_property_table)

}%


static const uint16_t _swift_stdlib_ExtendedGraphemeClusterNoBoundaryRulesMatrixImpl[] = {
% for row in get_extended_grapheme_cluster_rules_matrix(grapheme_cluster_break_property_table):
  ${row},
% end
};

SWIFT_RUNTIME_STDLIB_INTERFACE
const uint16_t *_swift_stdlib_ExtendedGraphemeClusterNoBoundaryRulesMatrix =
    _swift_stdlib_ExtendedGraphemeClusterNoBoundaryRulesMatrixImpl;

// ${'Local Variables'}:
// eval: (read-only-mode 1)
// End:
