744{
746 return;
747 }
748
752 return;
753 }
754
758 return;
759 }
760
761 auto current_span = convert_variant<double>(
m_data[0]);
762 std::vector<double> current_data(current_span.begin(), current_span.end());
763
764 auto channels = deinterleave_channels<double>(
765 std::span<const double>(current_data.data(), current_data.size()),
767
768 std::vector<double> reorganized_data;
771 } else {
772 reorganized_data.reserve(current_data.size());
773 for (
const auto& channel :
channels) {
774 reorganized_data.insert(reorganized_data.end(), channel.begin(), channel.end());
775 }
776 }
777
779
782
785}
std::atomic< bool > m_double_extraction_dirty
std::vector< DataVariant > m_data
void invalidate_span_cache()
Invalidate the span cache when data or layout changes.
ContainerDataStructure m_structure
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
@ ROW_MAJOR
C/C++ style (last dimension varies fastest)
@ PLANAR
Separate DataVariant per logical unit (LLL...RRR for stereo)
@ INTERLEAVED
Single DataVariant with interleaved data (LRLRLR for stereo)
std::vector< T > interleave_channels(const std::vector< std::vector< T > > &channels)
Interleave multiple channels of data into a single vector.
OrganizationStrategy organization
MemoryLayout memory_layout