module OroGen::TypekitMarshallers::Corba::ContainerType

Public Instance Methods

corba_arg_type() click to toggle source
# File lib/orogen/marshallers/corba.rb, line 247
def corba_arg_type; "#{corba_name} const&" end
corba_name() click to toggle source
# File lib/orogen/marshallers/corba.rb, line 235
def corba_name
    container_kind = self.container_kind.gsub /.*\//, ''
    element_name   = deference.name.gsub(/[^\w]/, "_")
    typedef_name = container_kind + "_" + element_name

    if deference.corba_name !~ /^orogen::/
        # This type is mapped into the root namespace
        "orogen::Corba::#{typedef_name}_"
    else
        "#{corba_namespace}::#{typedef_name}_"
    end
end
corba_namespace() click to toggle source
# File lib/orogen/marshallers/corba.rb, line 250
def corba_namespace
    deference.corba_namespace
end
corba_ref_type() click to toggle source
# File lib/orogen/marshallers/corba.rb, line 248
def corba_ref_type; "#{corba_name}&" end
from_corba(typekit, result, indent) click to toggle source
# File lib/orogen/marshallers/corba.rb, line 288
        def from_corba(typekit, result, indent)
            collection_name, element_type = container_kind, deference.name
            element_type = registry.build(element_type)

            if container_kind != "/std/vector"
                raise NotImplementedError, "from_corba is not implemented for other containers than std::vector, got #{container_kind}"
            end

            allocate_index do |element_idx|
                result << "#{indent}size_t const size_#{element_idx} = corba.length();\n"
                result << "#{indent}value.resize(size_#{element_idx});\n"

                if collection_name == "/std/vector" && 
                    element_type < NumericType

                    result << "if (!value.empty()) #{indent}memcpy(&value[0], &corba[0], size_#{element_idx});"
                else
                    result << <<-EOT
    #{indent}for(size_t #{element_idx} = 0; #{element_idx} < size_#{element_idx}; ++#{element_idx})
    #{indent}{
                    EOT

                    if element_type.inlines_code?
                        result << element_type.inline_fromCorba("value[#{element_idx}]", "corba[#{element_idx}]", indent)
                    elsif element_type < ArrayType
                        result << "#{indent}    fromCORBA(reinterpret_cast<#{element_type.deference.cxx_name}*>(value[#{element_idx}]), #{element_type.length}, corba[#{element_idx}]);\n";
                    else
                        result << "#{indent}    fromCORBA(value[#{element_idx}], corba[#{element_idx}]);\n";
                    end

                    result << "#{indent}}\n";
                end
            end
            result
        end
to_corba(typekit, result, indent) click to toggle source
# File lib/orogen/marshallers/corba.rb, line 254
        def to_corba(typekit, result, indent)
            collection_name, element_type = container_kind, deference.name
            element_type = registry.build(element_type)

            result << "#{indent}corba.length(value.size());\n"
            # Special case for array of bytes, we can do a simple memcpy
            # (maybe extend that later)
            if collection_name == "/std/vector" && 
                element_type < NumericType &&
                element_type.integer? &&
                element_type.size == 1

                result << "if (!value.empty()) #{indent}memcpy(&corba[0], &value[0], value.size());"
            else
                allocate_index do |element_idx|
                    result << <<-EOT
    #{indent}size_t #{element_idx} = 0;
    #{indent}for(#{cxx_name}::const_iterator it = value.begin(); it != value.end(); ++it, ++#{element_idx})
    #{indent}{
                    EOT

                    if element_type.inlines_code?
                        result << element_type.inline_toCorba("corba[#{element_idx}]", "(*it)", indent)
                    elsif element_type < ArrayType
                        result << indent << "    toCORBA(corba[#{element_idx}], reinterpret_cast< #{element_type.deference.cxx_name} const*>(*it), #{element_type.length});\n";
                    else
                        result << indent << "    toCORBA(corba[#{element_idx}], *it);\n";
                    end

                    result << "#{indent}}\n";
                end
            end
            result
        end