Implement support for "unmapped" enum types.
authorChris Hanson <org/chris-hanson/cph>
Sat, 25 Feb 2017 05:07:22 +0000 (21:07 -0800)
committerChris Hanson <org/chris-hanson/cph>
Sat, 25 Feb 2017 05:07:22 +0000 (21:07 -0800)
This maps them to index integers in the same order they appear in the enum.
Also change GCB to be unmapped.

src/etc/ucd-converter.scm
src/etc/ucd-raw-props/names.scm

index 29d9b69e240220db7b8d35a599b2ba0753781abc..a662478849a036d72b14eebc366d18ae177ac5cc 100644 (file)
@@ -71,6 +71,9 @@ USA.
        (eq? 'enum (car object))
        (every string? (cdr object))))
 
+(define (unmapped-enum-type-names enum-type)
+  (cdr enum-type))
+
 (define (mapped-enum-type? object)
   (and (list? object)
        (>= (length object) 2)
@@ -503,7 +506,7 @@ USA.
    prop-name metadata prop-alist proc-name))
 
 (define (code-generator:gcb prop-name metadata prop-alist proc-name)
-  ((trie-code-generator (mapped-enum-value-manager #f metadata) '(5 8 8))
+  ((trie-code-generator (unmapped-enum-value-manager #f metadata) '(5 8 8))
    prop-name metadata prop-alist proc-name))
 
 (define (code-generator:nfc-qc prop-name metadata prop-alist proc-name)
@@ -585,10 +588,24 @@ USA.
                             (error "Illegal rational value:" string))
                         n)))))
 
-(define (converter:mapped-enum metadata)
-  (let ((name (symbol->string (metadata-full-name metadata)))
-       (translations
-        (mapped-enum-type-translations (metadata-type-spec metadata))))
+(define (unmapped-enum-value-manager default-string metadata)
+  (value-manager default-string
+                (enum-converter metadata
+                                (let ((names
+                                       (unmapped-enum-type-names
+                                        (metadata-type-spec metadata))))
+                                  (map cons
+                                       names
+                                       (iota (length names)))))))
+
+(define (mapped-enum-value-manager default-string metadata)
+  (value-manager default-string
+                (enum-converter metadata
+                                (mapped-enum-type-translations
+                                 (metadata-type-spec metadata)))))
+
+(define (enum-converter metadata translations)
+  (let ((name (symbol->string (metadata-full-name metadata))))
     (lambda (value)
       (if value
          (let ((p
@@ -599,9 +616,6 @@ USA.
                (error (string-append "Illegal " name " value:") value))
            (cdr p))
          (default-object)))))
-
-(define (mapped-enum-value-manager default-string metadata)
-  (value-manager default-string (converter:mapped-enum metadata)))
 \f
 (define (hashed-code-generator value-manager)
   (let ((default-string (value-manager-default-string value-manager))
index 5c15cc8f9de6a63209e4ec7557624f8dd5940147..914582e8f880bf01ef1d97cba9d9d3d0d2cfd24c 100644 (file)
@@ -53,24 +53,8 @@ USA.
 ("Ext" extender boolean)
 ("FC_NFKC" fc-nfkc-closure code-point+)
 ("GCB" grapheme-cluster-break
- (enum ("CN" . control)
-       ("CR" . carriage-return)
-       ("EB" . emoji-base)
-       ("EBG" . emoji-base-gaz)
-       ("EM" . emoji-modifier)
-       ("EX" . extend)
-       ("GAZ" . glue-after-zero-width-joiner)
-       ("L" . hangul-syllable-type=l)
-       ("LF" . linefeed)
-       ("LV" . hangul-syllable-type=lv)
-       ("LVT" . hangul-syllable-type=lvt)
-       ("PP" . prepend)
-       ("RI" . regional-indicator)
-       ("SM" . spacing-mark)
-       ("T" . hangul-syllable-type=t)
-       ("V" . hangul-syllable-type=v)
-       ("XX" . other)
-       ("ZWJ" . zero-width-joiner)))
+ (enum "CN" "CR" "EB" "EBG" "EM" "EX" "GAZ" "L" "LF"
+       "LV" "LVT" "PP" "RI" "SM" "T" "V" "XX" "ZWJ"))
 ("Gr_Base" grapheme-base boolean)
 ("Gr_Ext" grapheme-extend boolean)
 ("Gr_Link" grapheme-link boolean)