• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            牽牛散步
            仗劍走天涯

            Slice語(yǔ)言

            首先,請(qǐng)大家讀ICE中文手冊(cè)中的Slice語(yǔ)言一章。 這一部分除了model(模塊),在 ICE 1.3中文手冊(cè)中都有描述

            圖 2.1. ice網(wǎng)絡(luò)編程示意圖(服務(wù)器端和客戶端采用同種編程語(yǔ)言C++)

            ice網(wǎng)絡(luò)編程示意圖(服務(wù)器端和客戶端采用同種編程語(yǔ)言C++)

            圖 2.2. ice網(wǎng)絡(luò)編程示意圖(服務(wù)器端和客戶端采用不同編程語(yǔ)言)

            ice網(wǎng)絡(luò)編程示意圖(服務(wù)器端和客戶端采用不同編程語(yǔ)言)

            基礎(chǔ)知識(shí)

            含有Slice 定義的文件必須以.ice 擴(kuò)展名結(jié)尾,例如, Clock.ice就是一個(gè)有效的文件名。編譯器拒絕接受其他擴(kuò)展名。

            Slice 支持#ifndef、#define、#endif,以及#include 預(yù)處理指令。它們的使用方式有嚴(yán)格的限制:你只能把#ifndef、#define,以及#endif 指令用于創(chuàng)建雙包括(double-include)塊。例如:

            #ifndef _CLOCK_ICE
            #define _CLOCK_ICE
            // #include 文件 here...
            //定義 here...
            #endif _CLOCK_ICE
            

            我們強(qiáng)烈建議你在所有的Slice 定義中使用雙包括(double-include)塊(所上),防止多次包括同一文件。

            #include 指令只能出現(xiàn)在Slice 源文件的開頭,也就是說(shuō),它們必須出現(xiàn)在其他所有Slice 定義的前面。此外,在使用#include 指令時(shí),只允許使用<> 語(yǔ)法來(lái)指定文件名,不能使用""。例如:

             #include <File1.ice> // OK
            #include "File2.ice" // 不支持!
            

            你不能把這些預(yù)處理指令用于其他目的,也不能使用其他的C++ 預(yù)處理指令 (比如用\ 字符來(lái)連接行、token 粘貼,以及宏展開,等等)。

            在Slice 定義里,既可以使用C 的、也可以使用C++ 的注釋風(fēng)格:

            Slice 關(guān)鍵字必須小寫。例如, class 和dictionary 都是關(guān)鍵字,必須按照所示方式拼寫。這個(gè)規(guī)則有兩個(gè)例外:Object 和LocalObject 也是關(guān)鍵字,必須按照所示方式讓首字母大寫。

            標(biāo)識(shí)符以一個(gè)字母起頭,后面可以跟任意數(shù)目的字母或數(shù)字。Slice 標(biāo)識(shí)符被限制在ASCII 字符范圍內(nèi),不能包含非英語(yǔ)字母,與C++ 標(biāo)識(shí)符不同, Slice 標(biāo)識(shí)符不能有下劃線。這種限制初看上去顯得很苛刻,但卻是必要的:保留下劃線,各種語(yǔ)言映射就獲得了一個(gè)名字空間,不會(huì)與合法的Slice 標(biāo)識(shí)符發(fā)生沖突。于是,這個(gè)名字空間可用于存放從Slice 標(biāo)識(shí)符派生的原生語(yǔ)言標(biāo)識(shí)符,而不用擔(dān)心其他合法的Slice 標(biāo)識(shí)符會(huì)碰巧與之相同,從而發(fā)生沖突 。

            標(biāo)識(shí)符(變量名等等)是大小寫不敏感的,但大小寫的拼寫方式必須保持一致(看了后面的話,再理解一下)。例如,在一個(gè)作用域內(nèi), TimeOfDay 和TIMEOFDAY 被認(rèn)為是同一個(gè)標(biāo)識(shí)符。但是,Slice 要求你保持大小寫的一致性。在你引入了一個(gè)標(biāo)識(shí)符之后,你必須始終一致地拼寫它的大寫和小寫字母;否則,編譯器就會(huì)將其視為非法而加以拒絕。這條規(guī)則之所以存在,是要讓Slice 既能映射到忽略標(biāo)識(shí)符大小寫的語(yǔ)言,又能映射到把大小寫不同的標(biāo)識(shí)符當(dāng)作不同標(biāo)識(shí)符的語(yǔ)言。(可以這樣理解,變量名區(qū)分大小寫,并且不可以是相同的單詞)

            是關(guān)鍵字的標(biāo)識(shí)符:你可以定義在一種或多種實(shí)現(xiàn)語(yǔ)言中是關(guān)鍵字的Slice 標(biāo)識(shí)符。例如,switch是完全合法的Slice標(biāo)識(shí)符,但也是C++和Java的關(guān)鍵字。語(yǔ)言映射定義了一些規(guī)則來(lái)處理這樣的標(biāo)識(shí)符。要解決這個(gè)問(wèn)題,通常要用一個(gè)前綴來(lái)使映射后的標(biāo)識(shí)符不再是關(guān)鍵字。例如, Slice 標(biāo)識(shí)符switch 被映射到C++ 的_cpp_switch ,以及Java 的_switch。對(duì)關(guān)鍵字進(jìn)行處理的規(guī)則可能會(huì)產(chǎn)生難以閱讀的源碼。像native、throw,或export 這樣的標(biāo)識(shí)符會(huì)與C++ 或Java(或兩者)的關(guān)鍵字發(fā)生沖突。為了讓你和別人生活得更輕松一點(diǎn),你應(yīng)該避免使用是實(shí)現(xiàn)語(yǔ)言的關(guān)鍵字的Slice 標(biāo)識(shí)符。要記住,以后Ice 可能會(huì)增加除C++ 和Java 以外的語(yǔ)言映射。盡管期望你總結(jié)出所有流行的編程語(yǔ)言的所有關(guān)鍵字并不合理,你至少應(yīng)該盡量避免使用常用的關(guān)鍵字。使用像self、import,以及while 這樣的標(biāo)識(shí)符肯定不是好主意。

            轉(zhuǎn)義的標(biāo)識(shí)符:在關(guān)鍵字的前面加上一個(gè)反斜線,你可以把Slice 關(guān)鍵字用作標(biāo)識(shí)符,例如:

            struct dictionary { // 錯(cuò)誤!
            // ...
            };
            struct \dictionary { // OK
            // ...
            };
            

            反斜線會(huì)改變關(guān)鍵字通常的含義;在前面的例子中, \dictionary 被當(dāng)作標(biāo)識(shí)符dictionary。轉(zhuǎn)義機(jī)制之所以存在,是要讓我們?cè)谝院竽軌蛟赟lice 中增加關(guān)鍵字,同時(shí)盡量減少對(duì)已有規(guī)范的影響:如果某個(gè)已經(jīng)存在的規(guī)范碰巧使用了新引入的關(guān)鍵字,你只需在新關(guān)鍵字前加上反斜線,就能夠修正該規(guī)范。注意,從風(fēng)格上說(shuō),你應(yīng)該避免用Slice 關(guān)鍵字做標(biāo)識(shí)符(即使反斜線轉(zhuǎn)義允許你這么做)。

            保留的標(biāo)識(shí)符:Slice 為Ice 實(shí)現(xiàn)保留了標(biāo)識(shí)符Ice 及以Ice (任何大小寫方式)起頭的所有標(biāo)識(shí)符。例如,如果你試圖定義一個(gè)名為Icecream 的類型, Slice 編譯器會(huì)發(fā)出錯(cuò)誤警告3。以下面任何一種后綴結(jié)尾的Slice 標(biāo)識(shí)符也是保留的:Helper、Holder、Prx,以及Ptr。Java 和C++ 語(yǔ)言映射使用了這些后綴,保留它們是為了防止在生成的代碼中發(fā)生沖突。

            (注:ICE 1.3的中文手冊(cè)上沒有“模塊”這一部分)模塊來(lái)組織一組相關(guān)的語(yǔ)句是為了解決名字沖突。模塊可以包含所有合法的Slice語(yǔ)句和子模塊。你可以用一些不常用的詞來(lái)給最外層的模塊命名,比如公司名、產(chǎn)品名等等。

            module ZeroC {
            
            	module Client {
            	// Definitions here...
            	};
            
            	module Server {
            	// Definitions here...
            	};
            };
            

            Slice要求所有的定義都是模塊的一部分,比如,下面的語(yǔ)句就是非法的。

            interface I { // 錯(cuò)誤:全局空間中只可以有模塊
            // ...
            };
            

            多個(gè)文件可以共享同一個(gè)模塊,比如:

            module ZeroC {
            // Definitions here...
            };
            
            //另一個(gè)文件中 :
            module ZeroC { // OK, reopened module
            // More definitions here...
            };
            

            把一個(gè)大的模塊放到幾個(gè)文件中去可以方便編譯(你只需重新編譯被修改的文件,而沒有必要編譯整個(gè)模塊)。

            模塊將映射的語(yǔ)言中的相應(yīng)結(jié)構(gòu),比如 C++, C#, 和 Visual Basic, Slice的modules被映射為namespaces;java中被映射為package.

            除了少數(shù)與特定的程序語(yǔ)言相關(guān)的調(diào)用之外,ice的絕大部分API(應(yīng)用程序接口)都是用Slice來(lái)定義的 。這樣做的好處是可以用一個(gè)ICE API定義文件來(lái)支持所有的程序語(yǔ)言。

            [注意] 注意
            為了保證代碼的簡(jiǎn)潔,以后文章中提及的Slice定義沒有寫出包含的模塊,你要假定該語(yǔ)句是在一個(gè)模塊中。

            表 2.1. Slice的數(shù)據(jù)類型

            類型 取值范圍 大小(單位:bit)
            bool false or true ≥ 1
            byte -128-127或0-255 ≥ 8
            short 2-15至215-1 ≥ 16
            int 2-31至231-1 ≥ 32
            long 2-63至263-1 ≥ 64
            float IEEE的單精度 ≥ 32 bits
            double IEEE的雙精度 ≥ 64 bits
            string 所有Unicode 字符,除了所有位為零的字符 變長(zhǎng)

            用戶定義的類型

            • 枚舉:enum Fruit { Apple, Pear, Orange };

              這個(gè)定義引入了一種名為Fruit 的類型,這是一種擁有自己權(quán)利的新類型。關(guān)于怎樣把順序值(ordinal values)賦給枚舉符的問(wèn)題, Slice 沒有作出定義。例如,你不能假定,在各種實(shí)現(xiàn)語(yǔ)言中,枚舉符Orange 的值都是2。Slice 保證枚舉符的順序值會(huì)從左至右遞增,所以在所有實(shí)現(xiàn)語(yǔ)言中,Apple 都比Pear 要小。與C++ 不同, Slice 不允許你控制枚舉符的順序值(因?yàn)樵S多實(shí)現(xiàn)語(yǔ)言不支持這種特性):

              enum Fruit { Apple = 0, Pear = 7, Orange = 2 }; // 出錯(cuò)
              

              在實(shí)踐中,只要你不在地址空間之間傳送枚舉符的順序值,你就不用管枚舉符使用的值是多少。例如,發(fā)送值0 給服務(wù)器來(lái)表示Apple 可能會(huì)造成問(wèn)題,因?yàn)榉?wù)器可能沒有用0 表示Apple。相反,你應(yīng)該就發(fā)送值A(chǔ)pple 本身。如果在接收方的地址空間中, Apple 是用另外的順序值表示的, Ice run time 會(huì)適當(dāng)?shù)胤g這個(gè)值。

              與在C++ 里一樣, Slice 枚舉符也會(huì)進(jìn)入圍繞它的名字空間,所以下面的定義是非法的:

              enum Fruit { Apple, Pear, Orange };
              enum ComputerBrands { Apple, IBM, Sun, HP }; // Apple已經(jīng)被定義!
              

              Slice 不允許定義空的枚舉。

            • 結(jié)構(gòu)

              Slice 支持含有一個(gè)或多個(gè)有名稱的成員的結(jié)構(gòu),這些成員可以具有任意類型,包括用戶定義的復(fù)雜類型。例如:
              struct TimeOfDay {
              short hour; // 0 - 23
              short minute; // 0 - 59
              short second; // 0 - 59
              };
              
              與在 C++ 里一樣,這個(gè)定義引入了一種叫作TimeOfDay 的新類型。結(jié)構(gòu)定義會(huì)形成名字空間,所以結(jié)構(gòu)成員的名字只需在圍繞它們的結(jié)構(gòu)里是唯一的。在結(jié)構(gòu)內(nèi)部,只能出現(xiàn)數(shù)據(jù)成員定義,這些定義必須使用有名字的類型。例如,你不可能在結(jié)構(gòu)內(nèi)定義結(jié)構(gòu):
              struct TwoPoints {
              struct Point { //錯(cuò)誤!
              short x;
              short y;
              };
              Point coord1;
              Point coord2;
              };
              
              這個(gè)規(guī)則大體上適用于Slice:類型定義不能嵌套(除了模塊支持嵌套)。其原因是,對(duì)于某些目標(biāo)語(yǔ)言而言,嵌套的類型定義可能會(huì)難以實(shí)現(xiàn),而且,即使能夠?qū)崿F(xiàn),也會(huì)極大地使作用域解析規(guī)則復(fù)雜化。對(duì)于像Slice 這樣的規(guī)范語(yǔ)言而言,嵌套的類型定義并無(wú)必要——你總能以下面的方式編寫上面的定義(這種方式在風(fēng)格上也更加整潔):
              struct Point {
              short x;
              short y;
              };
              struct TwoPoints { // Legal (and cleaner!)
              Point coord1;
              Point coord2;
              }
              
            • 序列

              序列是變長(zhǎng)的元素向量:

              sequence<Fruit> FruitPlatter;
              

              序列可以是空的——也就是說(shuō),它可以不包含元素;它也可以持有任意數(shù)量的元素,直到達(dá)到你的平臺(tái)的內(nèi)存限制。

              序列包含的元素自身也可以是序列。這種設(shè)計(jì)使得你能夠創(chuàng)建列表的列表:

              sequence<FruitPlatter> FruitBanquet;
              

              序列可用于構(gòu)建許多種collection,比如向量、列表、隊(duì)列、集合、包(bag),或是樹(次序是否重要要由應(yīng)用決定;如果無(wú)視次序,序列充當(dāng)?shù)木褪羌虾桶?

              序列的一種特別的用法已經(jīng)成了慣用手法,即用序列來(lái)表示可選的值。例如,我們可能擁有一個(gè)Part 結(jié)構(gòu),用于記錄小汽車的零件的詳細(xì)資料。這個(gè)結(jié)構(gòu)可以記錄這樣的資料:零件名稱、描述、重量、價(jià)格,以及其他詳細(xì)資料。 備件通常都有序列號(hào),我們用一個(gè)long 值表示。但有些零件,比如常用的螺絲釘,常常沒有序列號(hào),那么我們?cè)诼萁z釘?shù)男蛄刑?hào)字段里要放進(jìn)什么內(nèi)容?要處理這種情況,有這樣一些選擇:

              • 用一個(gè)標(biāo)記值,比如零,來(lái)指示“沒有序列號(hào)”的情況。

                這種方法是可行的,只要確實(shí)有標(biāo)記值可用。盡管看起來(lái)不大可能有人把零用作零件的序列號(hào),這并非是不可能的。而且,對(duì)于其他的值,比如溫度值,在其類型的范圍中的所有值都可能是合法的,因而沒有標(biāo)記值可用。

              • 把序列號(hào)的類型從long 變成string。

                串自己有內(nèi)建的標(biāo)記值,也就是空串,所以我們可以用空串來(lái)指示.“沒有序列號(hào)”的情況。這也是可行的,但卻會(huì)讓大多數(shù)人感到不快:我們不應(yīng)該為了得到一個(gè)標(biāo)記值,而把某種事物自然的數(shù)據(jù)類型變成string

              • 增加一個(gè)指示符來(lái)指示序列號(hào)的內(nèi)容是否有效.

                struct Part {
                string name;
                string description;
                // ...
                bool serialIsValid; // true if part has serial number
                long serialNumber;
                };
                

                對(duì)于大多數(shù)人而言,這也讓人討厭,而且最終肯定會(huì)讓你遇到麻煩:遲早會(huì)有程序員忘記在使用序列號(hào)之前檢查它是否有效,從而帶來(lái)災(zāi)難性的后果。

              • 用序列來(lái)建立可選字段

                這種技術(shù)使用了下面的慣用手法:

                sequence<long> SerialOpt;
                struct Part {
                string name;
                string description;
                // ...
                SerialOpt serialNumber; // optional: zero or one element
                };
                

                按照慣例, Opt 后綴表示這個(gè)序列是用來(lái)建立可選值的。如果序列是空的,值顯然就不在那里;如果它含有一個(gè)元素,這個(gè)元素就是那個(gè)值。這種方案明顯的缺點(diǎn)是,有人可能會(huì)把不止一個(gè)元素放入序列。為可選值增加一個(gè)專用的Slice 成分可以糾正這個(gè)問(wèn)題。但可選值并非那么常用,不值得為它增加一種專門的語(yǔ)言特性(我們將看到,你還可以用類層次來(lái)建立可選字段)。

            • 詞典

              詞典是從鍵類型到值類型的映射。例如:

              struct Employee {
              long number;
              string firstName;
              string lastName;
              };
              dictionary<long, Employee> EmployeeMap;
              

              這個(gè)定義創(chuàng)建一種叫作EmployeeMap 的詞典,把雇員號(hào)映射到含有雇員詳細(xì)資料的結(jié)構(gòu)。你可以自行決定鍵類型(在這個(gè)例子中是long 類型的雇員號(hào))是否是值類型(在這個(gè)例子中是Employee 結(jié)構(gòu))的一部分——就Slice 而言,你無(wú)需讓鍵成為值的一部分。

              詞典可用于實(shí)現(xiàn)稀疏數(shù)組,或是具有非整數(shù)鍵類型的任何用于查找的數(shù)據(jù)結(jié)構(gòu)。盡管含有鍵-值對(duì)的結(jié)構(gòu)的序列可用于創(chuàng)建同樣的事物,詞典要更為適宜:

              • 詞典明確地表達(dá)了設(shè)計(jì)者的意圖,也就是,提供從值的域(domain)到值的范圍(range)的映射(含有鍵-值對(duì)的結(jié)構(gòu)的序列沒有如此明確地表達(dá)同樣的意圖)。

              • 在編程語(yǔ)言一級(jí),序列被實(shí)現(xiàn)成向量(也可能是列表),也就是說(shuō),序列不大適用于內(nèi)容稀疏的域,而且要定位具有特定值的元素,需要進(jìn)行線性查找。而詞典被實(shí)現(xiàn)成支持高效查找的數(shù)據(jù)結(jié)構(gòu)(通常是哈希表或紅黑樹),其平均查找時(shí)間是O(log n),或者更好。詞典的鍵類型無(wú)需為整型。例如,我們可以用下面的定義來(lái)翻譯一周每一天的名稱:

                dictionary<string, string> WeekdaysEnglishToGerman;
                

                服務(wù)器實(shí)現(xiàn)可以用鍵-值對(duì)Monday–Montag、Tuesday–Dienstag,等等,對(duì)這個(gè)映射表進(jìn)行初始化。

              • 詞典的值類型可以是用戶定義的任何類型。但詞典的鍵類型只能是以下類型之一:

                • 整型(byte、short、int、long、bool,以及枚舉類型)

                • string

                • 元素類型為整型或string 的序列

                • 數(shù)據(jù)成員的類型只有整型或string 的結(jié)構(gòu)

                復(fù)雜的嵌套類型,比如嵌套的結(jié)構(gòu)或詞典,以及浮點(diǎn)類型(float和double),不能用作鍵類型。之所以不允許使用復(fù)雜的嵌套類型,是因?yàn)檫@會(huì)使詞典的語(yǔ)言映射復(fù)雜化;不允許使用浮點(diǎn)類型,是因?yàn)楦↑c(diǎn)值在跨越機(jī)器界線時(shí),其表示會(huì)發(fā)生變化,有可能導(dǎo)致成問(wèn)題的相等語(yǔ)義。

            • 常量定義與直接量

              Slice 允許你定義常量。常量定義的類型必須是以下類型中的一種:

              • 整型(bool、byte、short、int、long,或枚舉類型)

              • float 或double

              • string

              下面有一些例子:

              const bool AppendByDefault = true;
              const byte LowerNibble = 0x0f;
              const string Advice = "Don't Panic!";
              const short TheAnswer = 42;
              const double PI = 3.1416;
              enum Fruit { Apple, Pear, Orange };
              const Fruit FavoriteFruit = Pear;
              

              直接量(literals)的語(yǔ)法與C++ 和Java 的一樣(有一些小的例外):

              • 布爾常量只能用關(guān)鍵字false和true初始化(你不能用0和1來(lái)表示false和true)。

              • 和C++ 一樣,你可以用十進(jìn)制、八進(jìn)制,或十六進(jìn)制方式來(lái)指定整數(shù)直接量。例如:

                const byte TheAnswer = 42;
                const byte TheAnswerInOctal = 052;
                const byte TheAnswerInHex = 0x2A; // or 0x2a
                

                [注意] 注意
                如果你把byte 解釋成數(shù)字、而不是位模式,你在不同的語(yǔ)言里可能會(huì)得到不同的結(jié)果。例如,在C++ 里, byte 映射到char,取決于目標(biāo)平臺(tái), char 可能是有符號(hào)的,也可能是無(wú)符號(hào)的。
                [注意] 注意
                用于指示長(zhǎng)常量和無(wú)符號(hào)常量的后綴(C++ 使用的l、L、u、U)是非法的:
                const long Wrong = 0u; // Syntax error
                const long WrongToo = 1000000L; // Syntax error
                
                • 整數(shù)直接量的值必須落在其常量類型的范圍內(nèi),否則編譯器就會(huì)發(fā)出診斷消息。

                • 浮點(diǎn)直接量使用的是C++語(yǔ)法,除了你不能用l或L后綴來(lái)表示擴(kuò)展的浮點(diǎn)常量;但是, f 和F 是合法的(但會(huì)被忽略)。下面是一些例子:

                  const float P1 = -3.14f; // Integer & fraction, with suffix
                  const float P2 = +3.1e-3; // Integer, fraction, and exponent
                  const float P3 = .1; // Fraction part only
                  const float P4 = 1.; // Integer part only
                  const float P5 = .9E5; // Fraction part and exponent
                  const float P6 = 5e2; // Integer part and exponent
                  

                • 浮點(diǎn)直接量必須落在其常量類型(float 或double)的范圍內(nèi);否則編譯器會(huì)發(fā)出診斷警告。

                • 串直接量支持與C++ 相同的轉(zhuǎn)義序列。下面是一些例子:

                  const string AnOrdinaryString = "Hello World!";
                  const string DoubleQuote = "\"";
                  const string TwoSingleQuotes = "'\'"; // ' and \' are OK
                  const string Newline = "\n";
                  const string CarriageReturn = "\r";
                  const string HorizontalTab = "\t";
                  const string VerticalTab = "\v";
                  const string FormFeed = "\f";
                  const string Alert = "\a";
                  const string Backspace = "\b";
                  const string QuestionMark = "\?";
                  const string Backslash = "\\";
                  70 Slice 語(yǔ)言
                  const string OctalEscape = "\007"; // Same as \a
                  const string HexEscape = "\x07"; // Ditto
                  const string UniversalCharName = "\u03A9"; // Greek Omega
                  和在 C++ 里一樣,相鄰的串直接量會(huì)連接起來(lái):
                  const string MSG1 = "Hello World!";
                  const string MSG2 = "Hello" " " "World!"; // Same message
                  /*
                  * Escape sequences are processed before concatenation,
                  * so the string below contains two characters,
                  * '\xa' and 'c'.
                  */
                  const string S = "\xa" "c";
                  

                  [注意] 注意
                  Slice 沒有null 串的概念
                  const string nullString = 0; // Illegal!
                  
                  null 串在Slice 里根本不存在,因此,在Ice 平臺(tái)的任何地方它都不能用作合法的串值。這一決定的原因是, null 串在許多編程語(yǔ)言里不存在

            接口、操作,以及異常

            見手冊(cè)........抄書好累.........

            posted on 2005-12-13 12:00 牽牛散步 閱讀(3536) 評(píng)論(0)  編輯 收藏 引用 所屬分類: ICE學(xué)習(xí)資料
             
            亚洲成人精品久久| 久久狠狠高潮亚洲精品| 久久AV高清无码| 久久亚洲AV成人无码国产| 99久久精品免费看国产一区二区三区 | 波多野结衣久久精品| 久久九九全国免费| 久久99中文字幕久久| 97精品久久天干天天天按摩| 久久久无码精品亚洲日韩按摩| 久久久久亚洲精品无码蜜桃| 99久久99这里只有免费费精品| 波多野结衣中文字幕久久| 亚洲一区中文字幕久久| 久久综合九色欧美综合狠狠 | 亚洲国产成人久久一区久久| 国内精品久久久久久不卡影院| 久久久久亚洲AV成人网| 国产精品久久久久久久久久影院| 国产美女亚洲精品久久久综合 | 久久99国产亚洲高清观看首页| 国产一区二区精品久久凹凸| 久久精品国产一区二区三区不卡| 青青草国产97免久久费观看| 亚洲综合伊人久久综合| A级毛片无码久久精品免费| 亚洲日本va午夜中文字幕久久 | 久久99热这里只有精品国产| 伊人情人综合成人久久网小说| 中文字幕日本人妻久久久免费| 久久99热国产这有精品| 亚洲欧美一区二区三区久久| 久久这里只有精品久久| 欧美亚洲国产精品久久| 亚洲国产二区三区久久| 成人久久免费网站| 久久久久国产视频电影| 国产精品久久99| 97精品伊人久久久大香线蕉 | 久久夜色精品国产亚洲av| 国内精品久久久久影院优 |