Avro C++
|
00001 /* 00002 * Licensed to the Apache Software Foundation (ASF) under one 00003 * or more contributor license agreements. See the NOTICE file 00004 * distributed with this work for additional information 00005 * regarding copyright ownership. The ASF licenses this file 00006 * to you under the Apache License, Version 2.0 (the 00007 * "License"); you may not use this file except in compliance 00008 * with the License. You may obtain a copy of the License at 00009 * 00010 * http://www.apache.org/licenses/LICENSE-2.0 00011 * 00012 * Unless required by applicable law or agreed to in writing, software 00013 * distributed under the License is distributed on an "AS IS" BASIS, 00014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00015 * See the License for the specific language governing permissions and 00016 * limitations under the License. 00017 */ 00018 00019 #ifndef avro_Boost_hh__ 00020 #define avro_Boost_hh__ 00021 00022 #include <boost/version.hpp> 00023 00024 #define BOOST_MINOR_VERSION ( BOOST_VERSION / 100 % 1000 ) 00025 00026 #if (BOOST_MINOR_VERSION < 33) 00027 00028 /* 00029 * In boost 1.33, boost introduced the type trait definitions for true_type and 00030 * false_type, the pointer containers, and allow any objects to return 00031 * references. 00032 * 00033 * In order to support earlier versions of boost, if these do not exist we just 00034 * create them here. 00035 */ 00036 00037 #define AVRO_BOOST_NO_ANYREF 00038 #define AVRO_BOOST_NO_TRAIT 00039 #define AVRO_BOOST_NO_PTRVECTOR 00040 00041 #else 00042 #endif 00043 00044 #include <boost/any.hpp> 00045 00046 #ifdef AVRO_BOOST_NO_TRAIT 00047 // this is copied directly from boost documentation 00048 namespace boost { 00049 template <class T, T val> 00050 struct integral_constant { 00051 typedef integral_constant<T, val> type; 00052 typedef T value_type; 00053 static const T value = val; 00054 }; 00055 00056 typedef integral_constant<bool, true> true_type; 00057 typedef integral_constant<bool, false> false_type; 00058 } // namespace boost 00059 #else 00060 #include <boost/type_traits.hpp> 00061 #endif // AVRO_BOOST_NO_TRAIT 00062 00063 #ifdef AVRO_BOOST_NO_PTRVECTOR 00064 #include <vector> 00065 // this implements a minimal subset of ptr_vector (the parts of the API used by avro) 00066 namespace boost { 00067 template <class T> 00068 class ptr_vector { 00069 public: 00070 ptr_vector() : ptrs_() {} 00071 ~ptr_vector() { 00072 for(size_t i=0; i < ptrs_.size(); ++i) { 00073 delete ptrs_[i]; 00074 } 00075 } 00076 void push_back(T *v) { 00077 ptrs_.push_back(v); 00078 } 00079 void pop_back() { 00080 T *toDelete = ptrs_.back(); 00081 ptrs_.pop_back(); 00082 delete toDelete; 00083 } 00084 const T& back() const { 00085 return *ptrs_.back(); 00086 }; 00087 T& back() { 00088 return *ptrs_.back(); 00089 }; 00090 bool empty() const { 00091 return ptrs_.empty(); 00092 } 00093 const T& at(size_t index) const { 00094 return *(ptrs_.at(index)); 00095 } 00096 const T& operator[](size_t index) const { 00097 return *(ptrs_[index]); 00098 } 00099 size_t size() const { 00100 return ptrs_.size(); 00101 } 00102 void reserve(size_t elems) { 00103 ptrs_.reserve(elems); 00104 } 00105 private: 00106 std::vector<T *> ptrs_; 00107 }; 00108 } // namespace boost 00109 #else 00110 #include <boost/ptr_container/ptr_vector.hpp> 00111 #endif // AVRO_BOOST_NO_PTRVECTOR 00112 00113 #endif // avro_Boost_hh__