Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 211370a3 authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi Committed by Android (Google) Code Review
Browse files

Merge "Add memory view class for int and uint8_t." into lmp-dev

parents 35c62b2c 75d8c20d
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -127,4 +127,5 @@ LATIN_IME_CORE_TEST_FILES := \
    suggest/core/dictionary/bloom_filter_test.cpp \
    suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer_test.cpp \
    suggest/policyimpl/dictionary/utils/trie_map_test.cpp \
    utils/autocorrection_threshold_utils_test.cpp
    utils/autocorrection_threshold_utils_test.cpp \
    utils/int_array_view_test.cpp
+82 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef LATINIME_BYTE_ARRAY_VIEW_H
#define LATINIME_BYTE_ARRAY_VIEW_H

#include <cstdint>
#include <cstdlib>

#include "defines.h"

namespace latinime {

/**
 * Helper class used to keep track of read accesses for a given memory region.
 */
class ReadOnlyByteArrayView {
 public:
    ReadOnlyByteArrayView() : mPtr(nullptr), mSize(0) {}

    ReadOnlyByteArrayView(const uint8_t *const ptr, const size_t size)
            : mPtr(ptr), mSize(size) {}

    AK_FORCE_INLINE size_t size() const {
        return mSize;
    }

    AK_FORCE_INLINE const uint8_t *data() const {
        return mPtr;
    }

 private:
    DISALLOW_ASSIGNMENT_OPERATOR(ReadOnlyByteArrayView);

    const uint8_t *const mPtr;
    const size_t mSize;
};

/**
 * Helper class used to keep track of read-write accesses for a given memory region.
 */
class ReadWriteByteArrayView {
 public:
    ReadWriteByteArrayView() : mPtr(nullptr), mSize(0) {}

    ReadWriteByteArrayView(uint8_t *const ptr, const size_t size)
            : mPtr(ptr), mSize(size) {}

    AK_FORCE_INLINE size_t size() const {
        return mSize;
    }

    AK_FORCE_INLINE uint8_t *data() const {
        return mPtr;
    }

    AK_FORCE_INLINE ReadOnlyByteArrayView getReadOnlyView() const {
        return ReadOnlyByteArrayView(mPtr, mSize);
    }

 private:
    DISALLOW_ASSIGNMENT_OPERATOR(ReadWriteByteArrayView);

    uint8_t *const mPtr;
    const size_t mSize;
};

} // namespace latinime
#endif // LATINIME_BYTE_ARRAY_VIEW_H
+80 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef LATINIME_INT_ARRAY_VIEW_H
#define LATINIME_INT_ARRAY_VIEW_H

#include <cstdint>
#include <cstdlib>
#include <vector>

#include "defines.h"

namespace latinime {

/**
 * Helper class used to provide a read-only view of a given range of integer array. This class
 * does not take ownership of the underlying integer array but is designed to be a lightweight
 * object that obeys value semantics.
 *
 * Example:
 * <code>
 * bool constinsX(IntArrayView view) {
 *     for (size_t i = 0; i < view.size(); ++i) {
 *         if (view[i] == 'X') {
 *             return true;
 *         }
 *     }
 *     return false;
 * }
 *
 * const int codePointArray[] = { 'A', 'B', 'X', 'Z' };
 * auto view = IntArrayView(codePointArray, NELEMS(codePointArray));
 * const bool hasX = constinsX(view);
 * </code>
 */
class IntArrayView {
 public:
    IntArrayView() : mPtr(nullptr), mSize(0) {}

    IntArrayView(const int *const ptr, const size_t size)
            : mPtr(ptr), mSize(size) {}

    explicit IntArrayView(const std::vector<int> &vector)
            : mPtr(vector.data()), mSize(vector.size()) {}

    AK_FORCE_INLINE int operator[](const size_t index) const {
        ASSERT(index < mSize);
        return mPtr[index];
    }

    AK_FORCE_INLINE size_t size() const {
        return mSize;
    }

    AK_FORCE_INLINE const int *data() const {
        return mPtr;
    }

 private:
    DISALLOW_ASSIGNMENT_OPERATOR(IntArrayView);

    const int *const mPtr;
    const size_t mSize;
};

} // namespace latinime
#endif // LATINIME_MEMORY_VIEW_H
+38 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "utils/int_array_view.h"

#include <gtest/gtest.h>

#include <vector>

namespace latinime {
namespace {

TEST(MemoryViewTest, TestAccess) {
    static const int DATA_SIZE = 10000;

    std::vector<int> intVector = {3, 2, 1, 0, -1, -2};
    IntArrayView intArrayView(intVector);
    EXPECT_EQ(intVector.size(), intArrayView.size());
    for (int i = 0; i < DATA_SIZE; ++i) {
        EXPECT_EQ(intVector[i], intArrayView[i]);
    }
}

}  // namespace
}  // namespace latinime