ArrayDataType.cpp
Go to the documentation of this file.
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 }


variant_topic_tools
Author(s): Ralf Kaestner
autogenerated on Fri Aug 5 2016 06:06:26