AvroParse.hh 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * https://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. #ifndef avro_AvroParse_hh__
  19. #define avro_AvroParse_hh__
  20. #include "AvroTraits.hh"
  21. #include "Config.hh"
  22. #include "ResolvingReader.hh"
  23. /// \file
  24. ///
  25. /// Standalone parse functions for Avro types.
  26. namespace avro {
  27. /// The main parse entry point function. Takes a parser (either validating or
  28. /// plain) and the object that should receive the parsed data.
  29. template<typename Reader, typename T>
  30. void parse(Reader &p, T &val) {
  31. parse(p, val, is_serializable<T>());
  32. }
  33. template<typename T>
  34. void parse(ResolvingReader &p, T &val) {
  35. translatingParse(p, val, is_serializable<T>());
  36. }
  37. /// Type trait should be set to is_serializable in otherwise force the compiler to complain.
  38. template<typename Reader, typename T>
  39. void parse(Reader &p, T &val, const std::false_type &) {
  40. static_assert(sizeof(T) == 0, "Not a valid type to parse");
  41. }
  42. template<typename Reader, typename T>
  43. void translatingParse(Reader &p, T &val, const std::false_type &) {
  44. static_assert(sizeof(T) == 0, "Not a valid type to parse");
  45. }
  46. // @{
  47. /// The remainder of the file includes default implementations for serializable types.
  48. template<typename Reader, typename T>
  49. void parse(Reader &p, T &val, const std::true_type &) {
  50. p.readValue(val);
  51. }
  52. template<typename Reader>
  53. void parse(Reader &p, std::vector<uint8_t> &val, const std::true_type &) {
  54. p.readBytes(val);
  55. }
  56. template<typename T>
  57. void translatingParse(ResolvingReader &p, T &val, const std::true_type &) {
  58. p.parse(val);
  59. }
  60. // @}
  61. } // namespace avro
  62. #endif