Move pb_const_cast to pb_common.c
diff --git a/pb_common.c b/pb_common.c
index 8ff9bd1..2bbbeb8 100644
--- a/pb_common.c
+++ b/pb_common.c
@@ -222,6 +222,29 @@
     }
 }
 
+static void *pb_const_cast(const void *p)
+{
+    /* Note: this casts away const, in order to use the common field iterator
+     * logic for both encoding and decoding. The cast is done using union
+     * to avoid spurious compiler warnings. */
+    union {
+        void *p1;
+        const void *p2;
+    } t;
+    t.p2 = p;
+    return t.p1;
+}
+
+bool pb_field_iter_begin_const(pb_field_iter_t *iter, const pb_msgdesc_t *desc, const void *message)
+{
+    return pb_field_iter_begin(iter, desc, pb_const_cast(message));
+}
+
+bool pb_field_iter_begin_extension_const(pb_field_iter_t *iter, const pb_extension_t *extension)
+{
+    return pb_field_iter_begin_extension(iter, (pb_extension_t*)pb_const_cast(extension));
+}
+
 bool pb_default_field_callback(pb_istream_t *istream, pb_ostream_t *ostream, const pb_field_t *field)
 {
     if (field->data_size == sizeof(pb_callback_t))
diff --git a/pb_common.h b/pb_common.h
index 4db04d2..47fa2c9 100644
--- a/pb_common.h
+++ b/pb_common.h
@@ -18,6 +18,12 @@
 /* Get a field iterator for extension field. */
 bool pb_field_iter_begin_extension(pb_field_iter_t *iter, pb_extension_t *extension);
 
+/* Same as pb_field_iter_begin(), but for const message pointer.
+ * Note that the pointers in pb_field_iter_t will be non-const but shouldn't
+ * be written to when using these functions. */
+bool pb_field_iter_begin_const(pb_field_iter_t *iter, const pb_msgdesc_t *desc, const void *message);
+bool pb_field_iter_begin_extension_const(pb_field_iter_t *iter, const pb_extension_t *extension);
+
 /* Advance the iterator to the next field.
  * Returns false when the iterator wraps back to the first field. */
 bool pb_field_iter_next(pb_field_iter_t *iter);
diff --git a/pb_encode.c b/pb_encode.c
index 40f96bc..b851bfa 100644
--- a/pb_encode.c
+++ b/pb_encode.c
@@ -28,7 +28,6 @@
 static bool checkreturn encode_field(pb_ostream_t *stream, pb_field_iter_t *field);
 static bool checkreturn encode_extension_field(pb_ostream_t *stream, const pb_field_iter_t *field);
 static bool checkreturn default_extension_encoder(pb_ostream_t *stream, const pb_extension_t *extension);
-static void *pb_const_cast(const void *p);
 static bool checkreturn pb_encode_varint_32(pb_ostream_t *stream, uint32_t low, uint32_t high);
 static bool checkreturn pb_enc_bool(pb_ostream_t *stream, const pb_field_iter_t *field);
 static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_field_iter_t *field);
@@ -444,7 +443,7 @@
 {
     pb_field_iter_t iter;
 
-    if (!pb_field_iter_begin_extension(&iter, (pb_extension_t*)pb_const_cast(extension)))
+    if (!pb_field_iter_begin_extension_const(&iter, extension))
         PB_RETURN_ERROR(stream, "invalid extension");
 
     return encode_field(stream, &iter);
@@ -478,22 +477,10 @@
  * Encode all fields *
  *********************/
 
-static void *pb_const_cast(const void *p)
-{
-    /* Note: this casts away const, in order to use the common field iterator
-     * logic for both encoding and decoding. */
-    union {
-        void *p1;
-        const void *p2;
-    } t;
-    t.p2 = p;
-    return t.p1;
-}
-
 bool checkreturn pb_encode(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct)
 {
     pb_field_iter_t iter;
-    if (!pb_field_iter_begin(&iter, fields, pb_const_cast(src_struct)))
+    if (!pb_field_iter_begin_const(&iter, fields, src_struct))
         return true; /* Empty message type */
     
     do {