From 23f251b32c24c3657b7a46c887bf57f3d1949755 Mon Sep 17 00:00:00 2001 From: Lee Hinman Date: Thu, 9 Feb 2012 18:51:42 -0700 Subject: [PATCH] Use inlined functions for map/array encoding rather than functions --- src/cheshire/generate.clj | 119 +++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 60 deletions(-) diff --git a/src/cheshire/generate.clj b/src/cheshire/generate.clj index 16cf81da..f0887cb0 100644 --- a/src/cheshire/generate.clj +++ b/src/cheshire/generate.clj @@ -1,6 +1,6 @@ (ns cheshire.generate (:import (org.codehaus.jackson JsonGenerator) - (java.util List Date SimpleTimeZone UUID) + (java.util Date Map List Set SimpleTimeZone UUID) (java.sql Timestamp) (java.text SimpleDateFormat) (java.math BigInteger) @@ -38,63 +38,62 @@ Ratio (.writeNumber ~jg (double ~obj)) (fail ~obj))))) +(declare generate) + +(definline generate-map [^JsonGenerator jg obj ^String date-format] + `(do + (.writeStartObject ~jg) + (doseq [[k# v#] ~obj] + (.writeFieldName ~jg (if (keyword? k#) + (name k#) + (str k#))) + (generate ~jg v# ~date-format)) + (.writeEndObject ~jg))) + +(definline generate-array [^JsonGenerator jg obj ^String date-format] + `(do + (.writeStartArray ~jg) + (doseq [item# ~obj] + (generate ~jg item# ~date-format)) + (.writeEndArray ~jg))) + (defn generate [^JsonGenerator jg obj ^String date-format] - (let [generate-map (fn [^JsonGenerator jg m ^String date-format] - (do - (.writeStartObject jg) - (doseq [[k v] m - :let [field-name (if (keyword? k) - (name k) - (str k))]] - (.writeFieldName jg field-name) - (generate jg v date-format)) - (.writeEndObject jg))) - generate-array (fn [^JsonGenerator jg a ^String date-format] - (do - (.writeStartArray jg) - (dotimes [i (count obj)] - (generate jg (.get ^List obj i) date-format)) - (.writeEndArray jg)))] - (condp instance? obj - IPersistentCollection (condp instance? obj - clojure.lang.IPersistentMap - (generate-map jg obj date-format) - clojure.lang.IPersistentVector - (generate-array jg obj date-format) - clojure.lang.IPersistentSet - (generate jg (seq obj) date-format) - clojure.lang.ISeq - (do - (.writeStartArray jg) - (doseq [item obj] - (generate jg item date-format)) - (.writeEndArray jg))) - java.util.Map (generate-map jg obj date-format) - java.util.List (generate-array jg obj date-format) - java.util.Set (generate jg (seq obj) date-format) - Number (number-dispatch ^JsonGenerator jg obj) - String (write-string ^JsonGenerator jg ^String obj) - Keyword (write-string ^JsonGenerator jg - (if-let [ns (namespace obj)] - (str ns "/" (name obj)) - (name obj))) - UUID (write-string ^JsonGenerator jg (.toString ^UUID obj)) - Symbol (write-string ^JsonGenerator jg (if-let [sym (resolve obj)] - (str (:ns (meta sym)) - "/" - (:name (meta sym))) - (.toString ^Symbol obj))) - Boolean (.writeBoolean ^JsonGenerator jg ^Boolean obj) - Date (let [sdf (doto (SimpleDateFormat. date-format) - (.setTimeZone (SimpleTimeZone. 0 "UTC")))] - (write-string ^JsonGenerator jg (.format sdf obj))) - Timestamp (let [date (Date. (.getTime ^Timestamp obj)) - sdf (doto (SimpleDateFormat. date-format) - (.setTimeZone (SimpleTimeZone. 0 "UTC")))] - (write-string ^JsonGenerator jg (.format sdf obj))) - (if (nil? obj) - (.writeNull ^JsonGenerator jg) - ;; it must be a primative then - (try - (.writeNumber ^JsonGenerator jg obj) - (catch Exception e (fail obj))))))) + (condp instance? obj + IPersistentCollection (condp instance? obj + clojure.lang.IPersistentMap + (generate-map jg obj date-format) + clojure.lang.IPersistentVector + (generate-array jg obj date-format) + clojure.lang.IPersistentSet + (generate jg (seq obj) date-format) + clojure.lang.ISeq + (generate-array jg obj date-format)) + Map (generate-map jg obj date-format) + List (generate-array jg obj date-format) + Set (generate jg (seq obj) date-format) + Number (number-dispatch ^JsonGenerator jg obj) + String (write-string ^JsonGenerator jg ^String obj) + Keyword (write-string ^JsonGenerator jg + (if-let [ns (namespace obj)] + (str ns "/" (name obj)) + (name obj))) + UUID (write-string ^JsonGenerator jg (.toString ^UUID obj)) + Symbol (write-string ^JsonGenerator jg (if-let [sym (resolve obj)] + (str (:ns (meta sym)) + "/" + (:name (meta sym))) + (.toString ^Symbol obj))) + Boolean (.writeBoolean ^JsonGenerator jg ^Boolean obj) + Date (let [sdf (doto (SimpleDateFormat. date-format) + (.setTimeZone (SimpleTimeZone. 0 "UTC")))] + (write-string ^JsonGenerator jg (.format sdf obj))) + Timestamp (let [date (Date. (.getTime ^Timestamp obj)) + sdf (doto (SimpleDateFormat. date-format) + (.setTimeZone (SimpleTimeZone. 0 "UTC")))] + (write-string ^JsonGenerator jg (.format sdf obj))) + (if (nil? obj) + (.writeNull ^JsonGenerator jg) + ;; it must be a primative then + (try + (.writeNumber ^JsonGenerator jg obj) + (catch Exception e (fail obj))))))