From 280eb224e2e0630ec94a6072777d58354357ee67 Mon Sep 17 00:00:00 2001 From: "henrik.lundin" Date: Wed, 15 Feb 2017 02:53:05 -0800 Subject: [PATCH] Make AudioVector::operator[] inline and modify the index calculation to avoid the modulo operation. BUG=webrtc:7159 Review-Url: https://codereview.webrtc.org/2670643007 Cr-Commit-Position: refs/heads/master@{#16627} --- .../audio_coding/neteq/audio_vector.cc | 8 ------- .../modules/audio_coding/neteq/audio_vector.h | 23 +++++++++++++++++-- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/webrtc/modules/audio_coding/neteq/audio_vector.cc b/webrtc/modules/audio_coding/neteq/audio_vector.cc index ea737a5542..5cc1a44966 100644 --- a/webrtc/modules/audio_coding/neteq/audio_vector.cc +++ b/webrtc/modules/audio_coding/neteq/audio_vector.cc @@ -284,14 +284,6 @@ bool AudioVector::Empty() const { return begin_index_ == end_index_; } -const int16_t& AudioVector::operator[](size_t index) const { - return array_[(begin_index_ + index) % capacity_]; -} - -int16_t& AudioVector::operator[](size_t index) { - return array_[(begin_index_ + index) % capacity_]; -} - void AudioVector::Reserve(size_t n) { if (capacity_ > n) return; diff --git a/webrtc/modules/audio_coding/neteq/audio_vector.h b/webrtc/modules/audio_coding/neteq/audio_vector.h index 756292aa78..18ab95c46d 100644 --- a/webrtc/modules/audio_coding/neteq/audio_vector.h +++ b/webrtc/modules/audio_coding/neteq/audio_vector.h @@ -14,6 +14,7 @@ #include // Access to size_t. #include +#include "webrtc/base/checks.h" #include "webrtc/base/constructormagic.h" #include "webrtc/typedefs.h" @@ -110,12 +111,30 @@ class AudioVector { virtual bool Empty() const; // Accesses and modifies an element of AudioVector. - const int16_t& operator[](size_t index) const; - int16_t& operator[](size_t index); + inline const int16_t& operator[](size_t index) const { + return array_[WrapIndex(index, begin_index_, capacity_)]; + } + + inline int16_t& operator[](size_t index) { + return array_[WrapIndex(index, begin_index_, capacity_)]; + } private: static const size_t kDefaultInitialSize = 10; + // This method is used by the [] operators to calculate an index within the + // capacity of the array, but without using the modulo operation (%). + static inline size_t WrapIndex(size_t index, + size_t begin_index, + size_t capacity) { + RTC_DCHECK_GE(begin_index + index, index); // Check for overflow. + const size_t ix = begin_index + index >= capacity + ? begin_index + index - capacity + : begin_index + index; + RTC_DCHECK_LT(ix, capacity); + return ix; + } + void Reserve(size_t n); void InsertByPushBack(const int16_t* insert_this, size_t length,