En esta página

QSpan Class

template <typename T, std::size_t E = std::size_t(-1)> class QSpan

Un contenedor no propietario sobre datos contiguos. Más...

Cabecera: #include <QSpan>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Desde: Qt 6.7

Nota: Todas las funciones de esta clase son reentrantes.

Tipos Públicos

Funciones Públicas

QSpan()
QSpan(QSpan<S, N> other)
QSpan(Range &&r)
QSpan(const std::array<S, N> &arr)
QSpan(q20::type_identity_t<T> (&)[N] arr)
QSpan(std::array<S, N> &arr)
QSpan(std::initializer_list<QSpan<T, E>::value_type> il)
QSpan(std::span<S, N> other)
QSpan(It first, It last)
QSpan(It first, qsizetype count)
QSpan(const QSpan<T, E> &other)
QSpan(QSpan<T, E> &&other)
~QSpan()
auto back() const
auto begin() const
auto cbegin() const
auto cend() const
(since 6.9) void chop(QSpan<T, E>::size_type n)
(since 6.9) auto chopped(QSpan<T, E>::size_type n) const
auto crbegin() const
auto crend() const
auto data() const
auto empty() const
auto end() const
auto first() const
auto first(QSpan<T, E>::size_type n) const
auto front() const
auto isEmpty() const
auto last() const
auto last(QSpan<T, E>::size_type n) const
auto rbegin() const
auto rend() const
auto size() const
auto size_bytes() const
(since 6.9) void slice(QSpan<T, E>::size_type pos)
(since 6.9) void slice(QSpan<T, E>::size_type pos, QSpan<T, E>::size_type n)
auto sliced(QSpan<T, E>::size_type pos) const
auto sliced(QSpan<T, E>::size_type pos, QSpan<T, E>::size_type n) const
auto subspan() const
auto subspan() const
auto subspan(QSpan<T, E>::size_type pos) const
auto subspan(QSpan<T, E>::size_type pos, QSpan<T, E>::size_type n) const
QSpan<T, E> &operator=(QSpan<T, E> &&other)
QSpan<T, E> &operator=(const QSpan<T, E> &other)
QSpan<T, E>::reference operator[](QSpan<T, E>::size_type idx) const

Miembros públicos estáticos

const std::size_t extent
(since 6.8) auto as_bytes(QSpan<T, E> s)
(since 6.8) auto as_writable_bytes(QSpan<T, E> s)

Descripción detallada

Un QSpan hace referencia a una porción contigua de otro contenedor contiguo. Actúa como un tipo de interfaz para todo tipo de contenedores contiguos, sin necesidad de construir primero un contenedor propio como QList o std::vector.

Los datos referenciados por un QSpan pueden representarse como una matriz (o una estructura de datos compatible con matrices como QList, std::vector, QVarLengthArray, etc.). El propio QSpan almacena simplemente un puntero a los datos, por lo que los usuarios deben asegurarse de que los objetos QSpan no sobreviven a los datos a los que hacen referencia.

A diferencia de vistas como QStringView, QLatin1StringView y QUtf8StringView, los datos referenciados pueden ser modificados a través de un objeto QSpan. Para evitarlo, construya un QSpan sobre un const T (véase Const and Mutable Spans):

int numbers[] = {0, 1, 2};
QSpan<int> span = numbers;
span[0] = 42;
// numbers == {42, 1, 2};
QSpan<const int> cspan = numbers;
cspan[0] = 0; // ERROR: cspan[0] is read-only

Span de tamaño variable y de tamaño fijo

Un QSpan puede ser de tamaño fijo o variable.

Un span de tamaño variable se forma omitiendo el segundo argumento de la plantilla (o estableciéndolo en std::dynamic_extent, que, sin embargo, sólo está disponible en las versiones de C++20), como se ve en el ejemplo anterior.

Un tramo de tamaño fijo se forma pasando un número como segundo argumento de la plantilla:

int numbers[] = {0, 1, 2};
QSpan<int, 3> span = numbers;
QSpan<const int, 3> = numbers; // also OK

Como su nombre indica, size() de un span de tamaño fijo se fija en tiempo de compilación, mientras que size() de un span de tamaño variable sólo se determina en tiempo de ejecución.

Un span de tamaño fijo no es construible por defecto (a menos que su extent sea cero (0)). Un span de tamaño variable es construible por defecto y tendrá data() == nullptr y size() == 0.

Un tramo de tamaño fijo puede convertirse implícitamente en uno de tamaño variable. La dirección opuesta (de longitud variable a longitud fija) tiene la condición previa de que ambos tamaños deben coincidir.

Vanos constantes y mutables

A diferencia de los contenedores propios, const es poco profundo en QSpan: todavía se pueden modificar los datos a través de un QSpan const (pero no a través de un QSpan<const T>), y begin() y end() no están sobrecargados en const/non-const. Hay cbegin() y cend(), sin embargo, que devuelven const_iterators que impiden la modificación de los datos aunque T no sea const:

int numbers[] = {0, 1, 2};
const QSpan<int> span = numbers;
span.front() = 42;   // OK, numbers[0] == 42 now
*span.begin() = 31;  // OK, numbers[0] == 31 now
*span.cbegin() = -1; // ERROR: cannot assign through a const_iterator

Otras propiedades

QSpan debe pasarse por valor, no por referencia-a-const:

void consume(QSpan<const int> data); // OK
void consume(const QSpan<const int> &data); // works, but is non-idiomatic and less efficient

QSpan<T,N> es un tipo literal, independientemente de si T es un tipo literal o no.

QSpan vs. std::span

QSpan está estrechamente modelado a partir de std::span, pero tiene algunas diferencias que discutiremos aquí. Dado que ambos se convierten implícitamente el uno en el otro, eres libre de elegir el que más te guste en tu propio código.

  • QSpan utiliza el qsizetype con signo como size_type mientras que std::span utiliza size_t.
  • (desde Qt 6.9) QSpan<const T> no separa contenedores Qt, std::span sí.
  • Todos los constructores de QSpan son implícitos; muchos de std::span son explicit.
  • QSpan puede construirse a partir de contenedores propietarios de rvalue, std::span no.

Los dos últimos son necesarios para la compatibilidad de código fuente cuando las funciones que tomaban contenedores propios se convierten para tomar QSpan en su lugar, que es un caso de uso de vital importancia en Qt. El uso de qsizetype es por coherencia con el resto de contenedores Qt. Los argumentos de plantilla de QSpan siguen usando size_t para evitar introducir condiciones de error innecesarias (tamaños negativos).

Iteradores compatibles

QSpan puede construirse a partir de un iterador y un tamaño o a partir de un par de iteradores, siempre que los iteradores sean compatibles. Eventualmente, esto debería significar C++20 std::contiguous_iterator y std::sentinel_for, pero mientras Qt aún soporta C++17, sólo los punteros crudos son considerados iteradores contiguos.

Rangos compatibles

QSpan también puede construirse a partir de un rango compatible. Un rango es compatible si tiene compatible iterators.

Ver también QList, QStringView, QLatin1StringView, y QUtf8StringView.

Documentación de tipos de miembros

[alias] QSpan::const_iterator

Un alias para const T* y const_pointer, respectivamente.

Véase también const_pointer, iterator, const_reverse_iterator, y Const and Mutable Spans.

[alias] QSpan::const_pointer

Un alias para const T* y const element_type*, respectivamente.

Este alias se proporciona por compatibilidad con la STL.

Véase también element_type, pointer, const_reference, const_iterator, y Const and Mutable Spans.

[alias] QSpan::const_reference

Un alias para const T& y const element_type&, respectivamente.

Este alias se proporciona por compatibilidad con la STL.

Véase también element_type, reference, const_pointer, y Const and Mutable Spans.

[alias] QSpan::const_reverse_iterator

Un alias de std::reverse_iterator<const_iterator>.

Véase también const_iterator, reverse_iterator y Const and Mutable Spans.

[alias] QSpan::difference_type

Un alias para qptrdiff. Este differs from std::span.

Este alias se proporciona por compatibilidad con la STL.

[alias] QSpan::element_type

Un alias para T. Incluye const, si existe.

Este alias se proporciona por compatibilidad con la STL.

Véase también value_type, pointer, y Const and Mutable Spans.

[alias] QSpan::iterator

Un alias para T* y pointer, respectivamente. Incluye el const, si existe.

Véase también pointer, const_iterator, reverse_iterator, y Const and Mutable Spans.

[alias] QSpan::pointer

Un alias para T* y element_type*, respectivamente. Incluye const, si existe.

Este alias se proporciona por compatibilidad con la STL.

Véase también element_type, const_pointer, reference, iterator, y Const and Mutable Spans.

[alias] QSpan::reference

Un alias para T& y element_type&, respectivamente. Incluye const, si existe.

Este alias se proporciona por compatibilidad con la STL.

Véase también element_type, const_reference, pointer, y Const and Mutable Spans.

[alias] QSpan::reverse_iterator

Un alias para std::reverse_iterator<iterator>. Incluye el const, si existe.

Véase también iterator, const_reverse_iterator, y Const and Mutable Spans.

[alias] QSpan::size_type

Un alias para qsizetype. Este differs from std::span.

Este alias se proporciona por compatibilidad con la STL.

[alias] QSpan::value_type

Un alias para T. Excluye el const, si existe.

Este alias se proporciona por compatibilidad con la STL.

Véase también element_type y Const and Mutable Spans.

Documentación de funciones miembro

[default] QSpan::QSpan()

Constructor por defecto.

Este constructor sólo está presente si E es cero (0) o std::dynamic_extent. En otras palabras: sólo los vanos de tamaño fijo-cero o variable son construibles por defecto.

Véase también extent y Variable-Size and Fixed-Size Spans.

[constexpr noexcept] template < typename S, size_t N, QSpan<T, E>::if_qualification_conversion<S> = true > QSpan::QSpan(QSpan<S, N> other)

[constexpr noexcept] template < typename S, size_t N, QSpan<T, E>::if_qualification_conversion<S> = true > QSpan::QSpan(std::span<S, N> other)

Construye un QSpan que hace referencia a los datos del span suministrado other.

Restricciones

Participa en la resolución de sobrecargas sólo si

  • N o extent son std::dynamic_extent o extent == N
  • y S o const S son iguales a T.

[constexpr] template <typename Range, QSpan<T, E>::if_compatible_range<Range> = true> QSpan::QSpan(Range &&r)

Construye un QSpan referenciando los datos en el rango suministrado r.

Restricciones

Participa en la resolución de sobrecargas sólo si Range es a compatible range.

[constexpr noexcept] template <size_t N> QSpan::QSpan(q20::type_identity_t<T> (&)[N] arr)

[constexpr noexcept] template < typename S, size_t N, QSpan<T, E>::if_qualification_conversion<S> = true > QSpan::QSpan(std::array<S, N> &arr)

[constexpr noexcept] template < typename S, size_t N, QSpan<T, E>::if_qualification_conversion<S> = true > QSpan::QSpan(const std::array<S, N> &arr)

Construye un QSpan referenciando los datos del array suministrado arr.

Nota: q20::type_identity_t es un backport de C++20 a C++17. std::type_identity_t.

Restricciones

Participa en la resolución de sobrecargas sólo si

  • N o extent son std::dynamic_extent o en caso contrario extent == N
  • y S o const S son iguales a T.

[constexpr] QSpan::QSpan(std::initializer_list<QSpan<T, E>::value_type> il)

Construye un QSpan referenciando los datos de la lista inicializadora suministrada il.

Nota: Este constructor es noexcept sólo si E es std::dynamic_extent.

Nota: Si E no es std::dynamic_extent y el tamaño de il no es E, el comportamiento es indefinido.

Restricciones

Participa en la resolución de sobrecargas sólo si T es const-qualified.

Véase también Const and Mutable Spans.

[constexpr] template <typename It, QSpan<T, E>::if_compatible_iterator<It> = true> QSpan::QSpan(It first, It last)

Construye un QSpan referenciando los datos comenzando en first y teniendo la longitud (last - first).

[first, last) debe ser un rango válido.

Restricciones

Participa en la resolución de sobrecargas sólo si It es a compatible iterator.

[constexpr] template <typename It, QSpan<T, E>::if_compatible_iterator<It> = true> QSpan::QSpan(It first, qsizetype count)

Construye un QSpan referenciando los datos comenzando en first y teniendo la longitud count.

[first, count) debe ser un rango válido.

Restricciones

Participa en la resolución de sobrecargas sólo si It es a compatible iterator.

[default] QSpan::QSpan(const QSpan<T, E> &other)

[default] QSpan::QSpan(QSpan<T, E> &&other)

[default] QSpan<T, E> &QSpan::operator=(const QSpan<T, E> &other)

[default] QSpan<T, E> &QSpan::operator=(QSpan<T, E> &&other)

[default] QSpan::~QSpan()

Estas Funciones Miembro Especiales están implícitamente definidas.

Nota: Los movimientos son equivalentes a las copias. Sólo data() y size() se copian de tramo a tramo, no los datos referenciados.

[constexpr] auto QSpan::back() const

Devuelve una referencia al último elemento del span.

El span no debe estar vacío, de lo contrario el comportamiento es indefinido.

Véase también operator[](), front(), size(), empty(), y Const and Mutable Spans.

[constexpr noexcept] auto QSpan::begin() const

Devuelve un iterador que apunta al principio del tramo.

Dado que los iteradores de QSpan son sólo punteros, es lo mismo que llamar a data().

Ver también end(), cbegin(), rbegin(), crbegin(), data(), y Const and Mutable Spans.

[constexpr noexcept] auto QSpan::cbegin() const

Devuelve un const_iterator que apunta al principio del span.

Esto devolverá un iterador de sólo lectura incluso si T no es const:

QSpan<int> span = ~~~;
*span.begin() = 42; // OK
*span.cbegin() = 42; // ERROR: cannot assign through a const_iterator

Ver también cend(), begin(), crbegin(), rbegin(), data(), y Const and Mutable Spans.

[constexpr noexcept] auto QSpan::cend() const

Devuelve un const_iterator que apunta a uno pasado el final del tramo.

Véase también cbegin(), end(), crend(), rend(), data(), size() y Const and Mutable Spans.

[constexpr, since 6.9] void QSpan::chop(QSpan<T, E>::size_type n)

Igual que *this = chopped(n ) .

Esta función sólo está disponible en variable-sized spans.

Esta función se introdujo en Qt 6.9.

Véase también chopped().

[constexpr, since 6.9] auto QSpan::chopped(QSpan<T, E>::size_type n) const

Devuelve un variable-sized span de tamaño size() - n referenciando los primeros size() - n elementos de este span.

Igual que first(size() - n).

n debe ser no negativo.

Este span debe contener al menos n elementos (E >= n y size() >= n), de lo contrario el comportamiento es indefinido.

Esta función se introdujo en Qt 6.9.

Ver también subspan(), first(QSpan<T,E>::size_type), last(QSpan<T,E>::size_type), y chop().

[constexpr noexcept] auto QSpan::crbegin() const

Devuelve un const_reverse_iterator que apunta al principio del tramo invertido.

Véase también crend(), rbegin(), cbegin(), begin() y Const and Mutable Spans.

[constexpr noexcept] auto QSpan::crend() const

Devuelve un const_reverse_iterator que apunta a uno más allá del final del tramo invertido.

Véase también crbegin(), rend(), cend(), end() y Const and Mutable Spans.

[constexpr noexcept] auto QSpan::data() const

Devuelve un puntero al principio del tramo.

Es lo mismo que llamar a begin().

Véase también begin(), front() y Const and Mutable Spans.

[constexpr noexcept] auto QSpan::empty() const

[constexpr noexcept] auto QSpan::isEmpty() const

Devuelve si el span está vacío, es decir, si size() == 0.

Estas funciones hacen lo mismo: empty() se proporciona por compatibilidad con STL y isEmpty() se proporciona por compatibilidad con Qt.

Véase también size() y size_bytes().

[constexpr noexcept] auto QSpan::end() const

Devuelve un iterador que apunta a uno más allá del final del tramo.

Dado que los iteradores de QSpan son sólo punteros, es lo mismo que llamar a data() + size().

Ver también begin(), cend(), rend(), crend(), data(), size(), y Const and Mutable Spans.

[constexpr noexcept(...)] template <std::size_t Count> auto QSpan::first() const

Devuelve un fixed-sized span de tamaño Count que hace referencia a los primeros Count elementos de *this.

El span debe contener al menos Count elementos (E >= Count y size() >= Count), de lo contrario el comportamiento es indefinido.

Nota: Esta función es noexcept cuando subspan_always_succeeds_v<Count> es true.

Ver también first(QSpan<T,E>::size_type), last(), y subspan().

[constexpr] auto QSpan::first(QSpan<T, E>::size_type n) const

Devuelve un variable-sized span de tamaño n que hace referencia a los primeros n elementos de *this.

n debe ser no negativo.

El span debe contener al menos n elementos (E >= n y size() >= n), de lo contrario el comportamiento es indefinido.

Véase también first<N>(), last(QSpan<T,E>::size_type), subspan(QSpan<T,E>::size_type), subspan(QSpan<T,E>::size_type, QSpan<T,E>::size_type), sliced(), y chopped().

[constexpr] auto QSpan::front() const

Devuelve una referencia al primer elemento del span.

El span no debe estar vacío, de lo contrario el comportamiento es indefinido.

Véase también operator[](), back(), size(), empty(), y Const and Mutable Spans.

[constexpr noexcept(...)] template <std::size_t Count> auto QSpan::last() const

Devuelve un span fixed-sized de tamaño Count que hace referencia a los últimos elementos Count de *this.

El span debe contener al menos Count elementos (E >= Count y size() >= Count), de lo contrario el comportamiento es indefinido.

Nota: Esta función es noexcept cuando subspan_always_succeeds_v<Count> es true.

Ver también last(QSpan<T,E>::size_type), first(), y subspan().

[constexpr] auto QSpan::last(QSpan<T, E>::size_type n) const

Devuelve un variable-sized span de tamaño n que hace referencia a los últimos n elementos de *this.

n debe ser no negativo.

El span debe contener al menos n elementos (E >= n y size() >= n), de lo contrario el comportamiento es indefinido.

Véase también last(), first(QSpan<T,E>::size_type), subspan(QSpan<T,E>::size_type), subspan(QSpan<T,E>::size_type, QSpan<T,E>::size_type), sliced(), y chopped().

[constexpr noexcept] auto QSpan::rbegin() const

Devuelve un reverse_iterator que apunta al principio del tramo invertido.

Véase también rend(), crbegin(), begin(), cbegin() y Const and Mutable Spans.

[constexpr noexcept] auto QSpan::rend() const

Devuelve un reverse_iterator que apunta a uno más allá del final del tramo invertido.

Véase también rbegin(), crend(), end(), cend() y Const and Mutable Spans.

[constexpr noexcept] auto QSpan::size() const

Devuelve el tamaño del span, es decir, el número de elementos a los que hace referencia.

Véase también size_bytes(), empty() y isEmpty().

[constexpr noexcept] auto QSpan::size_bytes() const

Devuelve el tamaño del span en bytes, es decir, el número de elementos multiplicado por sizeof(T).

Véase también size(), empty() y isEmpty().

[constexpr, since 6.9] void QSpan::slice(QSpan<T, E>::size_type pos)

Igual que *this = sliced(pos ) .

Esta función sólo está disponible en variable-sized spans.

Esta función se introdujo en Qt 6.9.

Véase también sliced().

[constexpr, since 6.9] void QSpan::slice(QSpan<T, E>::size_type pos, QSpan<T, E>::size_type n)

Igual que *this = sliced(pos , n ) .

Esta función sólo está disponible en variable-sized spans.

Esta función se introdujo en Qt 6.9.

Véase también sliced().

[constexpr noexcept(...)] template <std::size_t Offset, std::size_t Count> auto QSpan::subspan() const

Devuelve un span de tamaño Count referenciando los elementos Count de este span comenzando en Offset.

Si *this es un span de tamaño variable, el tipo devuelto es un span de tamaño variable, en caso contrario es un span de tamaño fijo.

Este span debe contener al menos Offset + Count elementos (E >= Offset + Count y size() >= Offset + Count), de lo contrario el comportamiento es indefinido.

Nota: Esta función es noexcept cuando subspan_always_succeeds_v<Offset + Count> es true.

Véase también subspan(QSpan<T,E>::size_type, QSpan<T,E>::size_type), first(), last(), y Variable-Size and Fixed-Size Spans.

[constexpr noexcept(...)] template <std::size_t Offset> auto QSpan::subspan() const

Devuelve un tramo de tamaño E - Offset que hace referencia al resto de este tramo después de eliminar los primeros elementos de Offset.

Si *this es un span de tamaño variable, el tipo devuelto es un span de tamaño variable, en caso contrario es un span de tamaño fijo.

Este span debe contener al menos Offset elementos (E >= Offset y size() >= Offset), de lo contrario el comportamiento es indefinido.

Nota: Esta función es noexcept cuando subspan_always_succeeds_v<Offset> es true.

Véase también subspan(QSpan<T,E>::size_type), subspan(), first(), last(), y Variable-Size and Fixed-Size Spans.

[constexpr] auto QSpan::subspan(QSpan<T, E>::size_type pos) const

[constexpr] auto QSpan::sliced(QSpan<T, E>::size_type pos) const

Devuelve un tramo variable-sized de tamaño size() - pos que hace referencia al resto de este tramo después de eliminar los primeros elementos pos.

pos debe ser no negativo.

Este span debe contener al menos pos elementos (E >= pos y size() >= pos), de lo contrario el comportamiento es indefinido.

Estas funciones hacen lo mismo: subspan() se proporciona por compatibilidad con STL y sliced() se proporciona por compatibilidad con Qt.

Véase también subspan(), first(QSpan<T,E>::size_type), last(QSpan<T,E>::size_type), chopped(), y slice().

[constexpr] auto QSpan::subspan(QSpan<T, E>::size_type pos, QSpan<T, E>::size_type n) const

[constexpr] auto QSpan::sliced(QSpan<T, E>::size_type pos, QSpan<T, E>::size_type n) const

Devuelve un variable-sized span de tamaño n referenciando los n elementos de este span comenzando en pos.

Tanto pos como n deben ser no negativos.

Este span debe contener al menos pos + n elementos (E >= pos + n y size() >= pos + n), de lo contrario el comportamiento es indefinido.

Estas funciones hacen lo mismo: subspan() se proporciona por compatibilidad con STL y sliced() se proporciona por compatibilidad con Qt.

Véase también subspan(), first(QSpan<T,E>::size_type), last(QSpan<T,E>::size_type), chopped(), y slice().

[constexpr] QSpan<T, E>::reference QSpan::operator[](QSpan<T, E>::size_type idx) const

Devuelve una referencia al elemento en el índice idx en el span.

El índice debe estar dentro del rango, es decir, idx >= 0 y idx < size(), de lo contrario el comportamiento es indefinido.

Véase también front(), back(), size(), empty() y Const and Mutable Spans.

Documentación de variables miembro

const std::size_t QSpan::extent

El segundo argumento de plantilla de QSpan<T, E>, es decir, E. Se trata de std::dynamic_extent para variable-sized spans.

Nota: Mientras que todos los demás tamaños e índices de QSpan utilizan qsizetype, esta variable, al igual que E, es en realidad de tipo size_t, por compatibilidad con std::span y std::dynamic_extent.

Véase también size().

No miembros relacionados

[noexcept, since 6.8] auto as_bytes(QSpan<T, E> s)

Devuelve s como un QSpan<const std::byte, E'> cuyo size() es igual a s.size_bytes().

Si E es std::dynamic_extent entonces también lo es E'. En caso contrario, E' = E * sizeof(T).

Nota: q20::dynamic_extent es un backport de C++20 a C++17. std::dynamic_extent.

Esta función se introdujo en Qt 6.8.

Véase también as_writable_bytes(), size_bytes(), y Const and Mutable Spans.

[noexcept, since 6.8] auto as_writable_bytes(QSpan<T, E> s)

Devuelve s como un QSpan<std::byte, E'> cuyo size() es igual a s.size_bytes().

Si E es std::dynamic_extent entonces también lo es E'. En caso contrario, E' = E * sizeof(T).

Nota: q20::dynamic_extent es un backport de C++20 a C++17. std::dynamic_extent.

Restricciones

Participa en la resolución de sobrecargas sólo si !std::is_const_v<T>.

Esta función se introdujo en Qt 6.8.

Véase también as_bytes(), size_bytes(), y Const and Mutable Spans.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.