【CXX】6.3 [T], mut [T] — rust::Slice<T>

news/2025/3/27 8:56:16

rustSliceconst_T%E2%80%82rustSliceT_0">rust::Slice, rust::Slice

Rust 中的 &[T] 在 C++ 中写作 rust::Slice<const T>
Rust 中的 &mut [T] 在 C++ 中写作 rust::Slice<T>
公共 API:
// rust/cxx.h

template <typename T>
class Slice final {
public:
using value_type = T;

Slice() noexcept;
Slice(const Slice<T> &) noexcept;
Slice(T *, size_t count) noexcept;

template <typename C>
explicit Slice(C &c) : Slice(c.data(), c.size());

Slice &operator=(Slice<T> &&) & noexcept;
Slice &operator=(const Slice<T> &) & noexcept
requires std::is_const_v<T>;

T *data() const noexcept;
size_t size() const noexcept;
size_t length() const noexcept;
bool empty() const noexcept;

T &operator[](size_t n) const noexcept;
T &at(size_t n) const;
T &front() const noexcept;
T &back() const noexcept;

class iterator;
iterator begin() const noexcept;
iterator end() const noexcept;

void swap(Slice &) noexcept;
};
限制:

T 不能是不透明的 Rust 类型或不透明的 C++ 类型。对不透明 Rust 类型的切片支持即将推出。

允许作为函数参数或返回值。不支持在共享结构体中使用。

只有 rust::Slice 是可复制赋值的,rust::Slice 则不行。(两者都是可移动赋值的。)你需要偶尔写 std::move 来提醒自己,意外地将重叠的 &mut [T] 暴露给 Rust 是未定义行为。

示例

这个示例是一个 C++ 程序,它构造了一个包含 JSON 数据的切片(通过从 stdin 读取,但也可以来自任何地方),然后调用 Rust 来通过 serde_json 和 serde_transcode 库将该 JSON 数据漂亮地打印到一个 std::string 中。

rust">// src/main.rs

#![no_main] // main 定义在 C++ 的 main.cc 中

use cxx::CxxString;
use std::io::{self, Write};
use std::pin::Pin;

#[cxx::bridge]
mod ffi {
extern "Rust" {
fn prettify_json(input: &[u8], output: Pin<&mut CxxString>) -> Result<()>;
}
}

struct WriteToCxxString<'a>(Pin<&'a mut CxxString>);

impl<'a> Write for WriteToCxxString<'a> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.0.as_mut().push_bytes(buf);
Ok(buf.len())
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}

fn prettify_json(input: &[u8], output: Pin<&mut CxxString>) -> serde_json::Result<()> {
let writer = WriteToCxxString(output);
let mut deserializer = serde_json::Deserializer::from_slice(input);
let mut serializer = serde_json::Serializer::pretty(writer);
serde_transcode::transcode(&mut deserializer, &mut serializer)
}
// src/main.cc

#include "example/src/main.rs.h"
#include <iostream>
#include <iterator>
#include <string>
#include <vector>

int main() {
// 从 stdin 读取 json。
std::istreambuf_iterator<char> begin{std::cin}, end;
std::vector<unsigned char> input{begin, end};
rust::Slice<const uint8_t> slice{input.data(), input.size()};

// 使用 serde_json 和 serde_transcode 进行漂亮打印。
std::string output;
prettify_json(slice, output);

// 写入 stdout。
std::cout << output << std::endl;
}
测试示例:
$ echo '{"fearless":"concurrency"}' | cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
Running target/debug/example
{
"fearless": "concurrency"
}

http://www.niftyadmin.cn/n/5890065.html

相关文章

es6 尚硅谷 学习

1、let 1.变量不能重复声明 2.块级作用域 &#xff0c;只在块内有效 3.不存在变量提升&#xff0c;变量未声明之前不可使用 4.不影响作用域链 2、const const SCHOOL “温医”&#xff1b; 1.一定要有初始值 2.一般常量使用大写 3.常量不能赋值 4.块级作用域 5.对数组和对象…

AF3 make_fixed_size函数解读

AlphaFold3 data_transforms 模块的 make_fixed_size 函数的作用是将输入的蛋白质特征字典 protein 中的各个特征张量调整为固定大小。这是为了确保在批量处理时,所有特征张量的形状一致,从而避免形状不匹配的问题。 源代码: import itertools import torch from src.con…

神经网络机器学习中说的过拟合是什么意思

在神经网络和机器学习中&#xff0c;​过拟合&#xff08;Overfitting&#xff09;​ 是指模型在训练数据上表现非常好&#xff0c;但在未见过的测试数据上表现较差的现象。换句话说&#xff0c;模型过度学习了训练数据中的细节和噪声&#xff0c;导致其泛化能力&#xff08;Ge…

【反无人机目标检测】DRBD-YOLOv8

DRBD-YOLOv8&#xff1a;A Lightweight and Efficient Anti-UAV Detection Model DRBD-YOLOv8&#xff1a;一种轻量高效的无人机检测模型 0.论文摘要 摘要&#xff1a;由于对无人飞行器&#xff08;UAV&#xff09;相关的安全和隐私问题的日益关注&#xff0c;反无人机检测系统…

数据可视化新高度:用seaborn.heatmap为数据加热

前言 大家好,今天我们要聊聊数据可视化中最火热的一种方式:热力图!你可能会想,“数据可视化”听起来很高大上,难道不就是一些枯燥的图表和数字吗?别担心,今天我们让你瞬间明白。我们介绍的 seaborn.heatmap 不仅可以让你的数据看上去像一锅冒泡的热汤,还能轻松应对各种…

Linux:Ubuntu server 24.02 上搭建 ollama + dify

一、安装Ubuntu 具体的安装过程可以参见此链接&#xff1a;链接&#xff1a;Ubuntu Server 20.04详细安装教程&#xff0c;这里主要记录一下过程中遇到的问题。 安装时subnet如何填写 在Ubuntu中subnet填写255.255.255.0是错误的&#xff0c;其格式为 xx.xx.xx.xx/yy &#…

下载文件,文件名乱码问题

C# .net framework 4.8 mvc 项目&#xff0c;做一个文件下载功能。 原项目是前端使用razor引擎方式做页面渲染的。 该项目原来就有一个模块是可供文件下载的&#xff0c;且文件名是中文。 但是我现在新增的这个模块&#xff0c;领导要求用js写&#xff0c;觉得razor太笨重。 …

无服务架构:设计一个基于 AWS Lambda 和 S3 的音乐网站

作为开发者&#xff0c;我一直对如何构建高效、可扩展的网络应用感兴趣&#xff0c;尤其是如何在云平台上创建一个简单而强大的音乐网站。为了实现这个目标&#xff0c;我决定使用 AWS Lambda、S3 和一些其他 AWS 服务来设计和开发这个项目。以下是我在构建这个音乐网站时所采用…