Android14之模板类StaticString16解析(二百零一)

2024-03-25 11:04

本文主要是介绍Android14之模板类StaticString16解析(二百零一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:Android14之模板类StaticString16解析

2.StaticString16模板类介绍

  • Android 系统是一个基于 Linux 内核的开源操作系统,广泛应用于各种移动设备。在 Android 开发过程中,为了提高开发效率和可维护性,系统提供了一系列模板类,以简化特定类型的编程任务。StaticString16 是 Android 系统中一个用于处理 16 位字符串常量的模板类。
  • StaticString16 模板类的作用类似于 C++ 中的字符串常量,但它仅支持 16 位字符。在 Android 开发中,我们经常需要处理多种语言的字符串,而不同语言的字符集可能不同。StaticString16 正是为了解决这个问题而设计的。使用 StaticString16 可以让开发者编写更加通用和高效的代码,因为它是专门针对 16 位字符设计的。
  • StaticString16 模板类具有以下特点:
  1. 高效性:由于 StaticString16 专门针对 16 位字符设计,因此它的存储和处理效率更高。
  2. 可移植性:StaticString16 模板类可以处理多种语言的字符串,使得开发者编写的代码具有更好的可移植性。
  3. 安全性:StaticString16 模板类是 Android 系统的一部分,因此它的安全性和稳定性得到了保证。
  4. 易用性:StaticString16 模板类提供了简单的接口,使得开发者可以轻松地使用它来处理 16 位字符串常量。
  • 在 Android 开发过程中,使用 StaticString16 模板类可以带来很多好处。例如,在定义字符串常量时,我们可以使用 StaticString16 类型来指定字符串的长度为 16 位,这样可以确保字符串在不同的设备上都能正确显示。此外,使用 StaticString16 还可以避免在字符串常量中出现不必要的空格和换行符等问题。
  • 总之,StaticString16 是 Android 系统中一个非常有用的模板类。它专门用于处理 16 位字符串常量,具有高效、可移植、安全和易用等特点。在 Android 开发过程中,合理地使用 StaticString16 模板类可以提高开发效率,降低软件维护成本。

3.StaticString16模板类分析

<1>.StaticString16模板类实现

template <size_t N>
class StaticString16 : public String16 {
public:constexpr StaticString16(const char16_t (&s)[N]) : String16(mData), mData(makeStaticData(s)) {}constexpr StaticString16(const StaticString16<N>& other): String16(mData), mData(other.mData) {}constexpr StaticString16(const StaticString16<N>&&) = delete;static void* operator new(std::size_t) = delete;private:const StaticData<N> mData;
};

StaticString16模板类继承自String16类。
下面看下String16构造函数。

<2>.String16定义

class String16
{
public:String16();String16(const String16& o);String16(String16&& o) noexcept;String16(const String16& o,size_t len,size_t begin=0);explicit                    String16(const char16_t* o);explicit                    String16(const char16_t* o, size_t len);explicit                    String16(const String8& o);explicit                    String16(const char* o);explicit                    String16(const char* o, size_t len);~String16();inline  const char16_t*     string() const;private:static inline std::string   std_string(const String16& str);
public:size_t              size() const;void                setTo(const String16& other);status_t            setTo(const char16_t* other);status_t            setTo(const char16_t* other, size_t len);status_t            setTo(const String16& other,size_t len,size_t begin=0);status_t            append(const String16& other);status_t            append(const char16_t* other, size_t len);inline  String16&           operator=(const String16& other);String16&           operator=(String16&& other) noexcept;inline  String16&           operator+=(const String16& other);inline  String16            operator+(const String16& other) const;status_t            insert(size_t pos, const char16_t* chrs);status_t            insert(size_t pos,const char16_t* chrs, size_t len);ssize_t             findFirst(char16_t c) const;ssize_t             findLast(char16_t c) const;bool                startsWith(const String16& prefix) const;bool                startsWith(const char16_t* prefix) const;bool                contains(const char16_t* chrs) const;status_t            replaceAll(char16_t replaceThis,char16_t withThis);inline  int                 compare(const String16& other) const;inline  bool                operator<(const String16& other) const;inline  bool                operator<=(const String16& other) const;inline  bool                operator==(const String16& other) const;inline  bool                operator!=(const String16& other) const;inline  bool                operator>=(const String16& other) const;inline  bool                operator>(const String16& other) const;inline  bool                operator<(const char16_t* other) const;inline  bool                operator<=(const char16_t* other) const;inline  bool                operator==(const char16_t* other) const;inline  bool                operator!=(const char16_t* other) const;inline  bool                operator>=(const char16_t* other) const;inline  bool                operator>(const char16_t* other) const;inline                      operator const char16_t*() const;bool                isStaticString() const;private:static constexpr uint32_t kIsSharedBufferAllocated = 0x80000000;/** alloc() returns void* so that SharedBuffer class is not exposed.*/static void* alloc(size_t size);static char16_t* allocFromUTF8(const char* u8str, size_t u8len);static char16_t* allocFromUTF16(const char16_t* u16str, size_t u16len);void* edit();void* editResize(size_t new_size);void acquire();void release();size_t staticStringSize() const;const char16_t* mString;protected:template <size_t N>struct StaticData {// The high bit of 'size' is used as a flag.static_assert(N - 1 < kIsSharedBufferAllocated, "StaticString16 too long!");constexpr StaticData() : size(N - 1), data{0} {}const uint32_t size;char16_t data[N];constexpr StaticData(const StaticData<N>&) = default;};/** Helper function for constructing a StaticData object.*/template <size_t N>static constexpr const StaticData<N> makeStaticData(const char16_t (&s)[N]) {StaticData<N> r;for (size_t i = 0; i < N - 1; ++i) r.data[i] = s[i];return r;}template <size_t N>explicit constexpr String16(const StaticData<N>& s) : mString(s.data) {}
};

重点关注下: String16(const String16& o);构造函数实现

<3>.String16构造函数

system/core/libutils/String16.cpp

String16::String16(const String16& o) : mString(o.mString)
{acquire();
}

将传入的String16对象变量o,将o.mString赋值给mString类成员变量,mString的定义如下所示。

const char16_t* mString;

char16_t类型占2个byte。

这篇关于Android14之模板类StaticString16解析(二百零一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/844786

相关文章

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循