00001 /****************************************************************************** 00002 * Copyright (C) 2014 by Ralf Kaestner * 00003 * ralf.kaestner@gmail.com * 00004 * * 00005 * This program is free software; you can redistribute it and/or modify * 00006 * it under the terms of the Lesser GNU General Public License as published by* 00007 * the Free Software Foundation; either version 3 of the License, or * 00008 * (at your option) any later version. * 00009 * * 00010 * This program is distributed in the hope that it will be useful, * 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00013 * Lesser GNU General Public License for more details. * 00014 * * 00015 * You should have received a copy of the Lesser GNU General Public License * 00016 * along with this program. If not, see <http://www.gnu.org/licenses/>. * 00017 ******************************************************************************/ 00018 00019 #include "variant_topic_tools/ArrayDataType.h" 00020 #include "variant_topic_tools/ArraySerializer.h" 00021 #include "variant_topic_tools/ArrayVariant.h" 00022 #include "variant_topic_tools/Exceptions.h" 00023 00024 namespace variant_topic_tools { 00025 00026 /*****************************************************************************/ 00027 /* Constructors and Destructor */ 00028 /*****************************************************************************/ 00029 00030 ArrayDataType::ArrayDataType() { 00031 } 00032 00033 ArrayDataType::ArrayDataType(const DataType& memberType, size_t numMembers) { 00034 impl.reset(new boost::shared_ptr<DataType::Impl>( 00035 new ImplV(memberType, numMembers))); 00036 } 00037 00038 ArrayDataType::ArrayDataType(const ArrayDataType& src) : 00039 DataType(src) { 00040 } 00041 00042 ArrayDataType::ArrayDataType(const DataType& src) : 00043 DataType(src) { 00044 if (impl) 00045 BOOST_ASSERT(boost::dynamic_pointer_cast<Impl>(*impl)); 00046 } 00047 00048 ArrayDataType::~ArrayDataType() { 00049 } 00050 00051 ArrayDataType::Impl::Impl(const DataType& memberType) : 00052 memberType(memberType) { 00053 if (!memberType.isValid()) 00054 throw InvalidDataTypeException(); 00055 } 00056 00057 ArrayDataType::Impl::~Impl() { 00058 } 00059 00060 ArrayDataType::ImplV::ImplV(const DataType& memberType, size_t numMembers) : 00061 Impl(memberType), 00062 numMembers(numMembers) { 00063 } 00064 00065 ArrayDataType::ImplV::~ImplV() { 00066 } 00067 00068 /*****************************************************************************/ 00069 /* Accessors */ 00070 /*****************************************************************************/ 00071 00072 const DataType& ArrayDataType::getMemberType() const { 00073 if (!impl) { 00074 static DataType memberType; 00075 return memberType; 00076 } 00077 else 00078 return boost::static_pointer_cast<Impl>(*impl)->memberType; 00079 } 00080 00081 size_t ArrayDataType::getNumMembers() const { 00082 if (impl) 00083 return boost::static_pointer_cast<Impl>(*impl)->getNumMembers(); 00084 else 00085 return 0; 00086 } 00087 00088 bool ArrayDataType::isDynamic() const { 00089 if (impl) 00090 return boost::static_pointer_cast<Impl>(*impl)->isDynamic(); 00091 else 00092 return 0; 00093 } 00094 00095 const std::string& ArrayDataType::Impl::getIdentifier() const { 00096 if (identifier.empty()) { 00097 identifier = memberType.getIdentifier()+(getNumMembers() ? 00098 "["+boost::lexical_cast<std::string>(getNumMembers())+"]" : "[]"); 00099 } 00100 00101 return identifier; 00102 } 00103 00104 size_t ArrayDataType::ImplV::getNumMembers() const { 00105 return numMembers; 00106 } 00107 00108 size_t ArrayDataType::ImplV::getSize() const { 00109 return numMembers*memberType.getSize(); 00110 } 00111 00112 bool ArrayDataType::ImplV::isDynamic() const { 00113 return !numMembers; 00114 } 00115 00116 bool ArrayDataType::ImplV::isFixedSize() const { 00117 return numMembers && memberType.isFixedSize(); 00118 } 00119 00120 bool ArrayDataType::ImplV::isSimple() const { 00121 return false; 00122 } 00123 00124 /*****************************************************************************/ 00125 /* Methods */ 00126 /*****************************************************************************/ 00127 00128 Serializer ArrayDataType::ImplV::createSerializer(const DataType& type) const { 00129 return ArraySerializer(memberType.createSerializer(), numMembers); 00130 } 00131 00132 Variant ArrayDataType::ImplV::createVariant(const DataType& type) const { 00133 return ArrayVariant(type, memberType, numMembers); 00134 } 00135 00136 /*****************************************************************************/ 00137 /* Operators */ 00138 /*****************************************************************************/ 00139 00140 ArrayDataType& ArrayDataType::operator=(const DataType& src) { 00141 DataType::operator=(src); 00142 00143 if (impl) 00144 BOOST_ASSERT(boost::dynamic_pointer_cast<ArrayDataType::Impl>(*impl)); 00145 00146 return *this; 00147 } 00148 00149 }